为什么这个结构的大小为24?

时间:2015-06-06 19:35:14

标签: c

下面我的代码打印24但大小应该是: 1 + 7(垫)+ 8 + 4 = 20?

`

typedef struct data3
 {
   char        cval;
   double      dval;
   int         val;
 } structc_t;

//somewhere
printf("%d",sizeof(data3));

3 个答案:

答案 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,以使其大小应为chardoubleint大小的倍数。

看一下C FAQ says about alignment

的内容

答案 2 :(得分:0)

这是因为,与结构成员一起,结构类型变量也将具有自然对齐。

让我们说如果你分配一个这个结构的数组data3 array[2] 然后用你的逻辑看,双倍将是20 + 1 + 7 = 28

因此不是8的倍数。因此编译器将添加4个字节(另一个填充)以避免这种情况。

8的倍数为double需要8个字节,因此在一个周期内读取它需要8字节边界。