const对象不在rdata / rodata部分中

时间:2012-01-11 16:41:11

标签: c++ portable-executable

我无法强制msvc10将我的const对象放入.rdata部分。它始终以.data结尾,完美初始化(意味着没有动态初始化/运行时构造函数执行)。 (使用'release'build的标准项目设置编译)。 我不明白为什么以下代码不能将'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;
}

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

1 个答案:

答案 0 :(得分:3)

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

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