c++ - 编译器如何知道静态字段分配在哪里?

标签 c++

假设您有一个带有静态字段 int mstatic 的 A 类。 想象一下,如果那个类有一个修改 mstatic 的方法 mymethod。编译mymethod时,如何知道mstatic的地址?我知道在非静态字段的情况下,指向调用对象(著名的“this”)的指针被隐式传递给该方法,因此它用于查找地址,但我们如何处理静态字段?

最佳答案

静态字段的分配类似于 namespace 范围或全局变量...基本上有一个或两个区域(需要 0 初始化的变量可能与需要初始非 0 值的变量分开)在翻译中顺序填充所有此类变量单元。如果变量在另一个变量中定义,地址将在链接或加载期间被修补。请注意,地址通常是有效的硬编码(固定地址,可能来自特定数据段寄存器),不像堆栈(它可能是堆栈寄存器相关的,但堆栈寄存器随着函数被调用和返回而被修改,不像数据段寄存器可以在线程运行时设置为相同的值)或堆托管变量(其中地址在 mallocnew 期间确定。

关于c++ - 编译器如何知道静态字段分配在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28037957/

相关文章:

c++ - 使用标签调度时如何反转模板参数?

c++ - 如果未显式定义非 POD 常量,为什么会编译以下内容?

c++ - 为什么 std::condition_variable 作为类成员会导致 std::thread 出现编译错误?

c++ - 我正在尝试将 lambda 作为参数传递给模板可变参数

c++ - std::deque:如何获得指向指定索引处元素的迭代器?

c++ - GTK : Any way to mximize the window on Button trigger

c++ - 对使用多个内存池的类使用工厂是否合适?有更好的模式/技术吗?

c++ - 结构而不是清除/初始化所有数据

c++ - 在调用 ReadFile 程序后在 debug_heap.cpp 中命中断点

c++ - 编写从C++应用程序链接的Delphi DLL:访问C++接口(interface)成员函数会导致访问冲突