首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常量与静态常量

常量与静态常量
EN

Stack Overflow用户
提问于 2011-06-17 11:39:45
回答 2查看 15.3K关注 0票数 44

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-17 12:52:31

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

情况1:你从未使用过这个变量,编译器会悄悄地丢弃它。这不会发生在extern变量上。

情况2:你使用了变量,但是你从来不接受它的地址。编译器将变量的使用转换为立即操作数,就像它是#defineenum一样。编译器仍然可以将extern静态操作数转换为立即操作数,但是无论如何它仍然必须为它找到一个地址。

情况3:你使用变量并获取它的地址,编译器被迫在目标代码中找到一个位置来放置它,就像它是extern一样。

至于“数据”内存与“程序”内存的区别,这取决于你所使用的系统。在我的Linuxx64/ELF系统上,它可能会被放在.rodata段中,它与代码(.text)在同一段中,但与读写数据段(.bss.data)不同。我的系统似乎没有为只读、不可执行的数据创建单独的段。

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

票数 41
EN

Stack Overflow用户

发布于 2011-06-17 15:00:06

Dietrich已经很好地解释了static变量的情况。

对于局部变量,编译器实现在何处分配const限定变量有几种选择,该变量的地址是它的地址。它可以在堆栈上或在静态内存中分配,也可以不分配。对于const限定的复合文字尤其如此。在不同作用域中本地声明的两个这样的文字的地址可以合并为一个,并且它们的地址可以比较相等。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6381088

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档