2011-06-17 135 views
40

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

回答

38

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

案例1:您从不使用该变量,并且编译器会自动丢弃它。这与extern变量不会发生。

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

案例3:您使用该变量并取其地址,编译器被迫找到一个地方将其放入目标代码中,就好像它是extern一样。

至于“数据”与“程序”内存,那么,这是非常特定于您正在使用的系统。在我的Linux x64/ELF系统上,它可能会被放入.rodata部分,该部分与代码(.text)位于同一个段中,但与读写数据段(.bss,.data)不同。我的系统似乎不会为只读不可执行数据创建单独的段。

附录:请注意,C++中的行为不同。在C++中,默认情况下,const变量具有内部链接,因此static const是冗余的,extern const对于通过外部链接获取常量是必需的。

5

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

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