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)
如果有人知道,请让我知道为什么这样.谢谢哈拉
因为对齐.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个字节(没有浪费的字节用于填充).当然,这与编译器有很大关系,并且取决于您的编译选项.
| 归档时间: |
|
| 查看次数: |
179 次 |
| 最近记录: |