c++编译期间和运行期间

  1. 编译期
    编译期主要是编译器的预处理和编译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常量是编译器还是运行期,如果编译期常量可以作为数组大小,否则不可以。

模板实例化
非虚函数确定地址

  1. 运行期

动态内存分配(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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值