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

标签 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.
}

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

最佳答案

因为对齐。 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 个字节(没有为填充浪费的字节)。当然,这在很大程度上与编译器相关,并且取决于您的编译选项。

关于c++ - 为什么类对象的大小根据成员的顺序而不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4560797/

相关文章:

c++ - Qt 自定义窗口

c - 带数组和指针的 sizeof

c - 如何找到数组的大小(从指向第一个元素数组的指针)?

c++ - 实际结构尺寸

javascript - 类方法调用作为参数存储的另一个类的方法

c++ - 如何使用winapi实现类Steam窗口?

c++ - 通过两个不同的基类引用一个对象是否违反了严格的别名规则?

C++ 静态数组

php - 拆分一个大的 PHP 类

二级类不可读的 C++ 私有(private)变量