struct members内存布局

air*_*man 8 c c++

如果我有这样的结构:

struct S {
    ANY_TYPE a;
    ANY_TYPE b;
    ANY_TYPE c;
} s;
Run Code Online (Sandbox Code Playgroud)

我可以安全地假设以下假设在所有平台上始终都是正确的吗?

((char *)&s.a) < ((char *)&s.c)
((char *)&s.a + sizeof(s.a) + sizeof(s.b)) <= ((char *)&s.c)
Run Code Online (Sandbox Code Playgroud)

在C++中呢?

pax*_*blo 5

是的,至少在 C 中。编译器可以在任何结构成员之后自由插入填充,但不能对成员重新排序。

它也不得在第一个成员之前插入填充。

从C99, 6.7.2.1

13/在结构对象中,非位域成员和位域所在的单元的地址按它们声明的顺序增加。指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象内可能有未命名的填充,但不是在其开头。

15/在结构或联合的末尾可能有未命名的填充。

  • @DavidHammen 首先,vtables 是 C++ 的实现细节,而不是 C。其次,第一个成员前无填充要求仅适用于 POD(普通旧数据)。带有 vtable 的类不是 POD,因此允许在第一个数据成员之前有一个 vtable 指针。 (7认同)

pmr*_*pmr 5

这对于结构来说是正确的,但是只要引入访问说明符,就会对C++进行更改.允许编译器重新排序由访问说明符分隔的整个块.

  • @Xeo请参阅(例如)http://stackoverflow.com/questions/4883655/access-specifier-in-c/4883764#4883764不幸的是,这个答案没有标准引号.我会尝试提供一些.关于初始化:初始化与内存排序无关. (2认同)