编译器(例如GCC)如何分配const
和static const
变量,如何在,它将驻留在哪里?在数据存储器或程序存储器中?
答案 0 :(得分:39)
这取决于您的系统以及您如何使用该变量。对于static
变量:
案例1:您永远不会使用该变量,编译器会以静默方式丢弃该变量。 extern
变量不会发生这种情况。
案例2:您使用该变量,但您从不接受其地址。编译器将变量的使用转换为立即操作数,就像它是#define
或enum
一样。编译器仍然可以将extern
静态转换为立即操作数,但它仍然必须为它找到一个地址。
案例3:您使用变量并获取其地址,编译器被迫找到一个将其放入目标代码的位置,就像它是extern
一样。 / p>
对于“数据”与“程序”内存,嗯,这对您正在使用的系统非常具体。在我的Linux x64 / ELF系统上,它可能会放在.rodata
部分,它与代码(.text
)在同一段中,但与读写数据部分不同(.bss
{1}},.data
)。我的系统似乎不会为只读非可执行数据创建单独的段。
附录:请注意,C ++中的行为有所不同。在C ++中,const
变量默认具有内部链接,因此static const
是多余的,extern const
是获得外部链接常量所必需的。
答案 1 :(得分:5)
迪特里希已经很好地解释了static
变量的情况。
对于局部变量,编译器实现可以选择在哪里分配一个const
限定变量,并为其获取地址。它可能会也可能不会在堆栈或静态内存中分配。对于const
合格的复合文字尤其如此。在不同范围内本地声明的两个这样的文字的地址可以折叠成一个,并且它们的地址可以相等。