编译器是否将常量变量替换为它们在 C++ 中的值
Does the compiler replace constant variables with their value in C++?
处理器每次使用常量变量时都必须从内存中获取常量变量的值吗?如果常量变量无法更改,编译器可以用它们的值替换它们,不是吗?
是的。任何像样的编译器都会优化这些负载并替换它们。例如,对于 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
是一件好事。
这取决于
,因为有两种类型的常量:
- 编译时常量(
const
编译时初始化的变量,或constexpr
变量(。 - 运行时常量(类似于标记为
const
的参数(。
对于第一种类型(编译时常量(,编译器确实可以用实际值"替换"变量,这就是所有主要编译器都会做的事情。
对于第二种类型,这是不可能的,因为值在运行时之前是未知的。
要考虑的另一个方面是常量变量是否是独立的:如果 const 指针或引用未在其他地方使用 const 变量,则编译器可以对其进行优化。
但就像指针 b 使用变量 a 的情况一样,编译器无法优化变量,因为指针仍然需要一个地址来指向。
const int a = 5;
const int* b = &a;
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- C/C++预处理器是否可以检测一些编译器选项
- 是否可以用"iostream"包装现有的TCP/OOpenSSL会话