考虑以下c++类:
class MyClass
{
TypeA a;
TypeB b;
TypeC c;
};
我使用的编译器以一种方式创建该类的表示,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,其中利用了这一事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有写代码,它到目前为止工作。
我想知道现代操作系统中的ASLR
功能是否会把这搞砸。我很确定,如果对象在heap
上动态实例化,则不是这种情况。但其他情况呢?
不…内存布局中的顺序是由标准保证的,虽然成员之间也可以填充(总是包含在sizeof
结果中,但这确实意味着像你所描述的那样的黑客代码可能想要使用显式的pragma来打包数据成员或使用offsetof来计算要操作的偏移范围,否则它们可能会在布局不同的其他编译器/编译器设置上破坏。
单独来说,对象的布局是相同的,无论这些对象在哪里创建:全局,堆栈,堆-它总是相同的。考虑- offsetof是一个编译时常量