考虑以下C++类:

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

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

我想知道现代操作系统中的ASLR功能是否会搞砸。我很确定,如果在heap上动态实例化了对象,则不是这种情况。但是其他情况呢?

最佳答案

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

另外,无论对象的创建位置是什么,对象的布局都是相同的:全局变量,堆栈,堆-始终相同。考虑-offsetof是一个编译时间常数。

关于c++ - 地址空间布局随机化会影响C++类的内存布局吗,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16455225/

10-11 22:53
查看更多