我无法强制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。
答案 0 :(得分:3)
这些对象具有非常重要的构造函数,因此必须动态初始化而不是静态初始化。因此,它们位于.data
部分(所有动态初始化的对象都位于其中,因为它们的内存需要在初始化期间进行变异),即使编译器能够在这种情况下优化构造函数调用。
实际上,在这种情况下,没有什么能阻止编译器使用.rdata
。只是它的开发人员没有实现这一点。