C编译器是否有义务在内存中放置一个静态常量
Is C compiler obligated to place a static const in memory?
C编译器是否有义务将静态常量变量放入内存中,或者在被引用时允许将其用作立即指令操作数?
不,只要你不告诉它就行了。它可以很好地将常量用作汇编指令中的文字(立即)值。
否则可能是
- 声明常量
volatile
(告诉编译器:"我们不更改它,但其他人可以") - 声明和/或使用,即取消引用指向不是明确
const
的const
的指针
C编译器没有义务将任何东西放入内存。即使是非static
非const
变量也可以完全优化,只要编译器&链接器可以证明对象没有被外部引用(或者它的地址是在内部请求的,例如使用&
运算符),并且它的值不取决于任何不可预测的情况(例如用户输入)。
现代的C或C++编译器积极地执行这样的优化,这就是为什么来自较差的入门教科书的典型的低级"这就是你的程序是如何工作的"解释是误导性的,也是为什么我们用理论/抽象的术语来讨论这些语言的语义,而不是在用户按下按钮时纠结于RAM的哪个芯片上有哪些数据位。
关于如何允许这种优化的参考,请查阅"好像"规则。
相关文章:
- 用C++中的一个变量定义一个常量
- 从另一个常量标准::映射初始化一个常量标准::映射的一部分
- isdigit() 和 isalnum() 给出错误,因为输入是一个常量字符并且无法转换。其他可能查看输入是否为数字的方法?
- C++ 在 none 常量指针函数中返回一个常量指针
- 为什么重载"<<"需要一个常量参数?
- 为什么它是一个常量指针而不是指向常量指针
- 是一个常量句柄真的常量
- 将一个常量cstring附加到我自己的String类对象
- C++在类构造函数中定义了一个常量成员变量
- G++抱怨constexpr函数不是一个常量表达式
- 是一个常量字符串Still Preferrable
- 返回一个常量字符 *
- 将一个常量未签名的长流流式传输到流
- 从自定义 printf 函数返回一个常量字符*
- C++做虚函数总是必须是一个常量
- 我想将一个常量字符串写入包含另一个输入数据块的文件
- 如何计算初始化一个常量数组(制作常量查找表)
- C++:在初始化列表中传递一个常量 *p
- 我可以在 protobuf 中定义一个常量字符串吗?
- 初始化一个常量变量,如果失败则断言(c++)