下面我的代码打印24但大小应该是: 1 + 7(垫)+ 8 + 4 = 20?
`
typedef struct data3
{
char cval;
double dval;
int val;
} structc_t;
//somewhere
printf("%d",sizeof(data3));
答案 0 :(得分:6)
1 + 7 (pad) + 8 + 4 + 4 (pad) = 24
。您忘记了尾部填充,这是为了确保struct data3
元素在数组中正确对齐。整个结构必须在8字节边界上对齐,这意味着它的大小应该可以被8整除。
C语言保证数组的以下关系
sizeof(T[N]) == sizeof(T) * N
这立即意味着数组不能在元素之间添加自己的填充。如果需要任何元素间填充来正确对齐数组中的元素,则该填充应包含在单个数组元素中。没办法。
因此,即使您从未在数组中使用sizeof(struct data3)
,struct data3
也将包含特定于数组的填充。这就是你在结构中看到的尾部填充。
(如果你从不在数组中使用struct data3
,那么全局优化的编译器可能会优化它。但它通常是不值得的。)
答案 1 :(得分:1)
struct
的每个成员不仅必须与数据对齐,而且struct
本身必须与struct
中最大成员的大小对齐。因此,填充会添加到struct data3
,以使其大小应为char
,double
和int
大小的倍数。
答案 2 :(得分:0)
这是因为,与结构成员一起,结构类型变量也将具有自然对齐。
让我们说如果你分配一个这个结构的数组data3 array[2]
然后用你的逻辑看,双倍将是20 + 1 + 7 = 28
因此不是8的倍数。因此编译器将添加4个字节(另一个填充)以避免这种情况。
8的倍数为double需要8个字节,因此在一个周期内读取它需要8字节边界。