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

Har*_*adh 4 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.
}
Run Code Online (Sandbox Code Playgroud)

如果有人知道,请让我知道为什么这样.谢谢哈拉

Sim*_*one 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
Run Code Online (Sandbox Code Playgroud)

总共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
Run Code Online (Sandbox Code Playgroud)

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

  • @Haranadh Gupta:字对齐用于提高某些体系结构的性能.如果选择打包数据结构,"保存"字节,您可能会发现结果代码变得越来越大.您可能需要调整包装和对齐的原因,但节省空间很少是其中之一. (2认同)