Pet*_*uza 7 c++ struct endianness memory-alignment
假设这段代码:
unsigned char list[3] = { 1, 2, 3 };
struct _struct{
unsigned char a;
unsigned char b;
unsigned char c;
} *s;
s = ( _struct * ) list; Run Code Online (Sandbox Code Playgroud)
我能一直假设s->a == 1, s->b == 2, s->c == 3吗?
或者它将取决于系统的字节顺序或内存对齐?
让我们剖析一下.
在所有情况下,sizeof(char) == 1和list阵列将拥有三个成员的存储位置list,list + 1和list + 2.
这种情况struct并不十分清楚.标准保证成员将被分配到增加的内存位置,但不是它们将是连续的.编译器可以自由地在成员之间引入填充,并在末尾填充.
因此,s->a == 1永远都是如此.如果实现将unsigned chars放在struct相邻(和大多数意志)中,则其他等式必然为真.
顺便说一句,调用struct _struct可能会导致问题.在全局命名空间中以下划线开头的名称保留用于实现.