C编译器是否有义务在内存中放置一个静态常量

Is C compiler obligated to place a static const in memory?

本文关键字:一个 常量 静态 是否 编译器 有义务 内存      更新时间:2023-10-16

C编译器是否有义务将静态常量变量放入内存中,或者在被引用时允许将其用作立即指令操作数?

不,只要你不告诉它就行了。它可以很好地将常量用作汇编指令中的文字(立即)值。

否则可能是

  • 声明常量volatile(告诉编译器:"我们不更改它,但其他人可以")
  • 声明和/或使用,即取消引用指向不是明确constconst的指针

C编译器没有义务将任何东西放入内存。即使是非staticconst变量也可以完全优化,只要编译器&链接器可以证明对象没有被外部引用(或者它的地址是在内部请求的,例如使用&运算符),并且它的值不取决于任何不可预测的情况(例如用户输入)。

现代的C或C++编译器积极地执行这样的优化,这就是为什么来自较差的入门教科书的典型的低级"这就是你的程序是如何工作的"解释是误导性的,也是为什么我们用理论/抽象的术语来讨论这些语言的语义,而不是在用户按下按钮时纠结于RAM的哪个芯片上有哪些数据位。

关于如何允许这种优化的参考,请查阅"好像"规则。