常量与静态常量
编译器(如GCC)如何分配const
和static const
variables,如何在其驻留的位置? 在数据存储器或程序存储器中?
这取决于你的系统,以及你如何使用variables。 对于static
variables:
情况1:你永远不会使用这个variables,编译器会默默地丢弃它。 extern
variables不会发生这种情况。
情况2:你使用这个variables,但是你永远不会使用它的地址。 编译器将该variables的使用转换为立即操作数,就像它是#define
或enum
。 编译器仍然可以将extern
static转换为立即操作数,但它仍然必须为它find一个地址。
情况3:您使用variables并获取其地址,编译器被迫find一个放置在目标代码中的位置,就像是extern
。
至于“数据”与“程序”存储器,那么,这是非常特定于你正在使用的系统。 在我的Linux x64 / ELF系统上,它可能会被放到.rodata
节中,该节与代码( .text
)处于同一个段,但与读写数据段( .bss
, .data
)不同。 我的系统似乎不为独立的非可执行数据创build一个单独的网段。
附录:请注意,在C ++中的行为是不同的。 在C ++中,默认情况下, const
variables具有内部链接,所以static const
是冗余的, extern const
是通过外部链接获取extern const
所必需的。
迪特里希已经很好地解释了static
variables的情况。
对于局部variables,编译器实现有几个select,在哪里分配一个const
限定variables的地址。 它可能会或可能不会被分配在堆栈或静态内存中。 const
限定的复合文字尤其如此。 在不同的范围内本地声明的两个这样的文字的地址可以被合并成一个,并且它们的地址可以相等。