为什么类对象的大小根据成员的顺序而不同?

时间:2010-12-30 07:22:28

标签: c++ class sizeof

class CHaraICICCC
{
int i;
char c1;
int j;
char c2;
char c3;
char c4;
};

class CHaraIICCCC
{
int i;
int j;
char c1;
char c2;
char c3;
char c4;
};

void fun()
{
    CHaraICICCC eici;
    CHaraIICCCC eiicc;

    int icic = sizeof(eici); // -> output of icic is 16.
    int iicc = sizeof(eiicc); // -> output of icic is 12.
}

如果有人知道,请告诉我为什么这样。 谢谢 原

3 个答案:

答案 0 :(得分:8)

由于对齐。 x86编译器倾向于在4字节边界上对齐int类型(以便更快地访问内存),因此CHaraICICCC可能会按照以下方式进行布局:

byte  0: \
byte  1: | <--- int i
byte  2: |
byte  3: /  
byte  4: <----- char c1
byte  5: \
byte  6: | <--- Padding (wasted bytes)
byte  7: / 
byte  8: \
byte  9: | <--- int j  
byte 10: |
byte 11: /
byte 12: <----- char c2
byte 13: <----- char c3
byte 14: <----- char c4

总共15个字节,而CHaraIICCCC则为:

byte  0: \
byte  1: | <--- int i
byte  2: |
byte  3: /  
byte  4: \
byte  5: | <--- int j 
byte  6: |
byte  7: /
byte  8: <----- char c1
byte  9: <----- char c2
byte 10: <----- char c3
byte 11: <----- char c4

总共12个字节(没有浪费的字节用于填充)。当然,这与编译器有很大关系,并且取决于您的编译选项。

答案 1 :(得分:1)

稍微延伸“为什么”的问题,我我在某处读到对齐的原因是它让CPU忽略数据的位 - 如果你的数据是已知的例如,8字节对齐,CPU可以忽略地址的3个低位,从而提高效率。我可能是错的,但如果我没记错的话,这就是为什么CPU需要或者更喜欢对齐。

答案 2 :(得分:0)

使用默认打包模式,在大多数体系结构中,成员将以偏移量(从结构的开头)对齐,这是它们大小的倍数。

如果需要,填充字节将添加到结构中以获得该对齐。

因此,假设默认打包和4字节整数,您的第一个结构就是这样:

class CHaraICICCC
{
    int i;
    char c1;
    char padding[3];
    int j;
    char c2;
    char c3;
    char c4;
};