如果我有这样的结构:
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++中呢?
是的,至少在 C 中。编译器可以在任何结构成员之后自由插入填充,但不能对成员重新排序。
它也不得在第一个成员之前插入填充。
从C99, 6.7.2.1:
13/在结构对象中,非位域成员和位域所在的单元的地址按它们声明的顺序增加。指向结构对象的指针,经过适当转换,指向其初始成员(或者如果该成员是位域,则指向它所在的单元),反之亦然。结构对象内可能有未命名的填充,但不是在其开头。
15/在结构或联合的末尾可能有未命名的填充。
这对于结构来说是正确的,但是只要引入访问说明符,就会对C++进行更改.允许编译器重新排序由访问说明符分隔的整个块.