编译器(例如GCC)如何分配const
和static const
变量,如在哪里驻留?在数据存储器或程序存储器中?Const vs Static Const
40
A
回答
38
这取决于你的系统,以及你如何使用变量。对于static
变量:
案例1:您从不使用该变量,并且编译器会自动丢弃它。这与extern
变量不会发生。
案例2:您使用该变量,但您永远不会收到它的地址。编译器将该变量的使用转换为立即操作数,就像它是#define
或enum
一样。编译器仍然可以将extern
静态转换为立即操作数,但它仍然必须为其找到地址。
案例3:您使用该变量并取其地址,编译器被迫找到一个地方将其放入目标代码中,就好像它是extern
一样。
至于“数据”与“程序”内存,那么,这是非常特定于您正在使用的系统。在我的Linux x64/ELF系统上,它可能会被放入.rodata
部分,该部分与代码(.text
)位于同一个段中,但与读写数据段(.bss
,.data
)不同。我的系统似乎不会为只读不可执行数据创建单独的段。
附录:请注意,C++中的行为不同。在C++中,默认情况下,const
变量具有内部链接,因此static const
是冗余的,extern const
对于通过外部链接获取常量是必需的。
5
迪特里希已经很好地解释了static
变量的情况。
对于局部变量,编译器实现有多个选择,以便在哪里分配const
限定了该地址的限定变量。它可能会或可能不会被分配在堆栈或静态内存中。 const
合格的复合文字尤其如此。在不同范围内本地声明的两个这样的文字的地址可以被合并为一个,并且它们的地址可以相等。
相关问题
- 1. static const char * const和static const char []之间有什么区别?
- 2. static const和const有什么区别?
- 3. static const std :: vector
- 4. static const arrays
- 5. const vs new const
- 6. static const与extern const不同吗?
- 7. static const variable as macro
- 8. public static class或const
- 9. const struct {x} vs struct {const x}
- 10. gcc:__DATA,__ const vs __TEXT,__ const
- 11. Const char * vs const wchar_t *(concatenation)
- 12. static const int as map subscript
- 13. static const char地址返回
- 14. C#,使用static和const
- 15. 基类中的const与派生类中的static const
- 16. 哪个更适合:“const”还是“static readonly”?
- 17. func(QWidget * const&Widget)VS func(QWidget * const Widget)
- 18. “extern const”vs“extern”only
- 19. C++中的static const vs constexpr成员字段11/14?
- 20. 继承自std :: true_type vs static constexpr const布尔成员
- 21. “static const”vs“#define”为了提高效率C
- 22. const vs Func <string>
- 23. Windows C++:LPCTSTR vs const TCHAR
- 24. 铸造const void * const const *
- 25. 转const const wchar_t *为const char *
- 26. VB #const,/ const等
- 27. const CFoo&bar()const
- 28. const char * const char **
- 29. Pascal:Const Const Const
- 30. 为const char * VS字符*