struct unaming
{
char f;
double dd;
struct
{
int data;
char c;
double d;
};
};
我原以为这个结构的大小是 40 字节。但是编译器返回了 32 个字节。 我期待以下布局。
[char f][7 bytes][double dd] [int data][4 bytes][char c][7bytes][double d] = 40
这是基于结构及其成员变量将与存在的最大数据类型对齐的规则。
但看起来编译器重新排序了未命名的结构。是这样吗?为什么是 32 字节?
最佳答案
规则并不是每个结构体成员都必须按照结构体中成员的最大对齐要求来对齐。规则是每个成员都必须根据自己的对齐要求进行对齐。
对于您的结构,假设 char
、int
和 double
的大小分别为 1、4 和 8 个字节,并且假设它们的对齐要求也是 1、4 和 8 个字节,典型 C 实现中的布局是:
char f
位于偏移量 0。- 7 个字节的填充使偏移量达到 8,这是
double
所需要的。 double dd
位于偏移量 8。struct
从偏移量 16 开始。int data
位于偏移量 16。char c
位于偏移量 20 处。- 三个字节的填充使偏移量达到 24,这是
double
所需要的。 double d
位于偏移量 24。
这使得总大小为 32 字节。因为它是八的倍数,所以最后不需要填充。 (由于结构可以用在数组中,因此结构的总大小需要是其对齐要求的倍数,以便数组中的连续结构落在所需的对齐边界上。)
关于c++ - 未命名结构的编译器重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51869099/