1

考虑以下 C++ 类:

class MyClass
{
    TypeA a;
    TypeB b;
    TypeC c;
};

我使用的编译器创建此类的表示形式,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,利用这个事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有编写代码并且它到目前为止工作。

我想知道ASLR现代操作系统中的功能是否会搞砸这一切。我很确定如果对象在heap. 但是其他情况呢?

4

1 回答 1

3

不......内存布局中的顺序由标准保证,尽管成员之间也可以有填充(总是包含在sizeof结果中,但这确实意味着像你描述的那样的hacky代码可能想要使用显式的编译指示打包数据成员或使用 offsetof 计算要操作的偏移范围,否则它们可能会在布局不同的其他一些编译器/编译器设置上中断。

另外,无论这些对象是在哪里创建的,对象的布局都是相同的:全局、堆栈、堆 - 它总是相同的。考虑 - offsetof 是一个编译时间常数。

于 2013-05-09T05:51:11.677 回答