c++类的内存布局是否会受到地址空间布局随机化的影响?

Can the memory layout of a C++ class be influenced by address space layout randomization

本文关键字:空间布局 地址 随机化 影响 内存 布局 是否 c++      更新时间:2023-10-16

考虑以下c++类:

class MyClass
{
    TypeA a;
    TypeB b;
    TypeC c;
};
我使用的编译器以一种方式创建该类的表示,即内存中成员的顺序与我在类定义中使用的顺序相同。我最近遇到了一个程序,其中利用了这一事实来初始化成员。我知道这是一个非常糟糕的主意,因为布局取决于编译器,但我没有写代码,它到目前为止工作。

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

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

单独来说,对象的布局是相同的,无论这些对象在哪里创建:全局,堆栈,堆-它总是相同的。考虑- offsetof是一个编译时常量