编译器是否将常量变量替换为它们在 C++ 中的值

Does the compiler replace constant variables with their value in C++?

本文关键字:C++ 是否 常量 变量 替换 编译器      更新时间:2023-10-16

处理器每次使用常量变量时都必须从内存中获取常量变量的值吗?如果常量变量无法更改,编译器可以用它们的值替换它们,不是吗?

是的。任何像样的编译器都会优化这些负载并替换它们。例如,对于 Clang 8.0.0,以下源代码:

#include <stdio.h>
const int a = 34;
int main()
{
    int z = a;
    printf("%d", z);
}

给我这个asm:

main:                                   # @main
        push    rax
        mov     edi, offset .L.str
        mov     esi, 34
        xor     eax, eax
        call    printf
        xor     eax, eax
        pop     rcx
        ret
.L.str:
        .asciz  "%d"

请注意,a 在 asm 中不存在,只有34存在。

在这个简单的示例中,a甚至不必const编译器就会注意到它永远不会被更改。如果在优化下编译,删除它仍然具有相同的效果。

请注意,情况并非总是如此,因此帮助编译器添加const/constexpr是一件好事。

这取决于

,因为有两种类型的常量:

  1. 编译时常量(const编译时初始化的变量,或constexpr变量(。
  2. 运行时常量(类似于标记为 const 的参数(。

对于第一种类型(编译时常量(,编译器确实可以用实际值"替换"变量,这就是所有主要编译器都会做的事情。

对于第二种类型,这是不可能的,因为值在运行时之前是未知的。

要考虑的另一个方面是常量变量是否是独立的:如果 const 指针或引用未在其他地方使用 const 变量,则编译器可以对其进行优化。

但就像指针 b 使用变量 a 的情况一样,编译器无法优化变量,因为指针仍然需要一个地址来指向。

const int a = 5;
const int* b = &a;