Const与静态Const

时间:2011-06-17 03:39:45

标签: c

编译器(例如GCC)如何分配conststatic const变量,如何在,它将驻留在哪里?在数据存储器或程序存储器中?

2 个答案:

答案 0 :(得分:39)

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

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

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

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

对于“数据”与“程序”内存,嗯,这对您正在使用的系统非常具体。在我的Linux x64 / ELF系统上,它可能会放在.rodata部分,它与代码(.text)在同一段中,但与读写数据部分不同(.bss {1}},.data)。我的系统似乎不会为只读非可执行数据创建单独的段。

附录:请注意,C ++中的行为有所不同。在C ++中,const变量默认具有内部链接,因此static const是多余的,extern const是获得外部链接常量所必需的。

答案 1 :(得分:5)

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

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