常量对象不在 rdata/rodata 部分

ved*_*ved 5 c++ portable-executable

我无法强制 msvc10 将 const 对象放入 .rdata 部分。它总是以 .data 结尾,完美初始化(意味着没有动态初始化/运行时构造函数执行)。(使用“发布”构建的标准项目设置进行编译)。我不明白为什么以下代码不能将 'obj1' 放入 .rdata PE 部分:

typedef struct _Struct1 {
  int m1;
  _Struct1(int p1): m1(p1) {};
  _Struct1() {};
} Struct1;

class Class1 {
public:
  Class1() {};
  Class1(int p1, int p2): m1(p1), m2_struct(p2) {};
  int m1;
  Struct1 m2_struct;
};

const Class1 obj1(1, 2);

int main() {
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么 obj1 不转到 rdata(在 IDA 中检查)以及在当前情况下如何强制它?Tnx。

小智 3

这些对象具有重要的构造函数,因此必须动态而不是静态地初始化它们。因此,它们位于该.data部分(所有动态初始化的对象都位于该部分,因为它们的内存需要在初始化期间发生变化),即使编译器能够在这种情况下优化构造函数调用。

实际上,没有什么可以阻止编译器在这种情况下使用.rdata。只是它的开发者没有实现这一点。