Const与静态Const

fre*_*nix 42 c

编译器(例如GCC)如何分配conststatic const变量,如何位于?在数据存储器或程序存储器中?

Die*_*Epp 39

这取决于您的系统,以及您如何使用变量.对于static变量:

案例1:您永远不会使用变量,编译器会以静默方式丢弃它.extern变量不会发生这种情况.

案例2:您使用变量,但您从不接受其地址.编译器将变量的使用转换为立即操作数,就像它是a #defineenum.编译器仍然可以将extern静态转换为立即操作数,但它仍然必须为它找到一个地址.

案例3: 您使用变量并获取其地址,编译器被迫找到一个将其放入目标代码的位置,就像它一样extern.

至于"数据"与"程序"内存,那么,这对您正在使用的系统非常具体.在我的Linux x64/ELF系统上,它可能会放在.rodata与code(.text)相同的段中,但与读写数据段(.bss,.data)不同的段.我的系统似乎不会为只读非可执行数据创建单独的段.

附录:请注意,C++中的行为是不同的.在C++中,const变量默认具有内部链接,因此static const是冗余的,extern const并且必须通过外部链接获得常量.


Jen*_*edt 5

迪特里希已经static很好地解释了变量的情况.

对于局部变量,编译器实现可以选择在何处分配const为其获取地址的限定变量.它可能会也可能不会在堆栈或静态内存中分配.对于const合格的复合文字,情况尤其如此.在不同范围内本地声明的两个这样的文字的地址可以折叠成一个,并且它们的地址可以相等.