我知道
constexpr
创建一个常量,该值始终在编译期间创建。但是普通变量呢?如果我这样做int x = 1
这个变量的值是在编译时还是运行时赋值的?
对于以下仅包含一行的程序:
int main()
{
int x = 1;
}
为 x86-64(优化级别 0)生成的汇编输出是:
main: # @main
push rbp
mov rbp, rsp
mov dword ptr [rbp - 4], 1
xor eax, eax
pop rbp
ret
看那条线,
mov dword ptr [rbp - 4], 1
。这意味着它在编译时知道(因为它存在于生成的程序集中)需要将 1 移动到 x
的内存位置,因为有一条移动指令(立即寻址模式)。