- 编译期
编译期主要是编译器的预处理和编译C++代码,(汇编和链接是对机器码不考虑)。
预处理阶段:
宏替换 #define,
条件编译 #ifndef #endif
头文件
编译:执行类型检查,语法检查,以及为变量确定内存分配大小,这些变量包括全局或静态变量,栈上的变量。所以说数组大小必须是编译期间确定的值,编译期间并不给变量分配内存,而是确定好内存大小,等到运行分配。
sizeof编译期运行:
sizeof(A)确定A的对象会占多大内存,如果A中有虚函数那么A的对象会有虚表指针,sizeof计算时会把指针的内存大小加上。
const修饰的变量是只读,是编译期常量也可能运行期常量。取决于初始化时在编译器还是运行期。
何时初始化取决于右边的值是在编译器还是运行期确定的。如
const int a = get_len(); | 运行期初始化 |
---|---|
const int a = i; | 运行期初始化 |
const int a = 100; | 编译期初始化 |
所以初始化在编译器还是运行期决定了const常量是编译器还是运行期,如果编译期常量可以作为数组大小,否则不可以。
模板实例化
非虚函数确定地址
- 运行期
动态内存分配(new/malloc);
虚函数确定地址。
class A{
public:
virtual void f(){ cout << "A" << endl; }
};
class B :public A
{
private:
void f(){ cout << "B" << endl; }
};
int main()
{
A *pA = new B();
pA->f(); //“B”
return 0;
}
程序不会报错,因为语法检查在编译期,所以检查到pA的f()是public所以不会报错,但是虚函数确定地址是在运行期,所以执行的派生类f()。
参考:
https://blog.csdn.net/m0_37264397/article/details/76697237