编译器(例如,GCC)如何分配const和static const变量,例如,它将驻留在哪里?在数据存储器还是程序存储器中?
发布于 2011-06-17 12:52:31
这取决于您的系统,以及您如何使用该变量。对于static变量:
情况1:你从未使用过这个变量,编译器会悄悄地丢弃它。这不会发生在extern变量上。
情况2:你使用了变量,但是你从来不接受它的地址。编译器将变量的使用转换为立即操作数,就像它是#define或enum一样。编译器仍然可以将extern静态操作数转换为立即操作数,但是无论如何它仍然必须为它找到一个地址。
情况3:你使用变量并获取它的地址,编译器被迫在目标代码中找到一个位置来放置它,就像它是extern一样。
至于“数据”内存与“程序”内存的区别,这取决于你所使用的系统。在我的Linuxx64/ELF系统上,它可能会被放在.rodata段中,它与代码(.text)在同一段中,但与读写数据段(.bss,.data)不同。我的系统似乎没有为只读、不可执行的数据创建单独的段。
附录:请注意,C++中的行为是不同的。在C++中,默认情况下,const变量具有内部链接,因此static const是多余的,必须使用extern const才能获得具有外部链接的常量。
发布于 2011-06-17 15:00:06
Dietrich已经很好地解释了static变量的情况。
对于局部变量,编译器实现在何处分配const限定变量有几种选择,该变量的地址是它的地址。它可以在堆栈上或在静态内存中分配,也可以不分配。对于const限定的复合文字尤其如此。在不同作用域中本地声明的两个这样的文字的地址可以合并为一个,并且它们的地址可以比较相等。
https://stackoverflow.com/questions/6381088
复制相似问题