找到未对齐结构的正确大小

时间:2013-11-27 09:48:19

标签: c

 typedef struct structA 
{
   char        C;
   double      D;
   int         I;
} structA_t;

此structA_t结构的大小:

  

sizeof(char)+ 7字节填充+ sizeof(double)+ sizeof(int)= 1 + 7 +   8 + 4 = 20字节

但这是错误的,正确的是

  

24

。为什么?

4 个答案:

答案 0 :(得分:2)

最后ìnt之后很可能是4字节填充。

如果您的平台上sizeof(double) == 8可能alignof(double) == 8。 考虑一下这种情况:

structA_t array[2];

如果大小只有20,那么array[1].D将会错位(地址可以被4整除,而不是8,这是必需的对齐)。

答案 1 :(得分:1)

char = 1个字节

double = 8字节

int = 4个字节

对齐double =>

padding char => 1+7 

padding double => 8+0

padding int => 4+4

=> 24字节

或简单地说,是最大=>的倍数。 3(字段数)* 8(最大的大小)= 24

答案 2 :(得分:0)

我猜你的系统中int的大小是4字节,所以int也必须用4字节填充,以达到8字节的字大小。

total_size=sizeof(char) + 7 Byte padding + sizeof(double) + sizeof(int) + 4 Bytes padding = 24 Bytes

答案 3 :(得分:0)

关于填充/对齐的好文章: http://www.drdobbs.com/cpp/padding-and-rearranging-structure-member/240007649

由于双重成员,它强制所有内容都是八字节对齐。

如果你想要一个更小的结构,那么下面的结构只给你16个字节!

typedef struct structA 
{
   int         I;
   char        C;
   double      D;
} structA_t;