为什么我班级的人数大于其成员的总和?

时间:2016-05-15 19:31:40

标签: c++ class sizeof

有人可以帮我理解sizeof()运营商的行为吗?

 #include <iostream>

using namespace std;

class A{
    int first;
    double last;
    public:
    A(int a)
    {
        cout << a << endl;
    }
};
int main()
{
    A a(3);
    cout << sizeof(a) << endl;
    return 0;
}

此代码将我的大小打印为16个字节。类的大小是根据其成员计算的。所以我有4个字节(int)+ 8个字节(double)= 12。

那我为什么得到16个字节?

当我评论intdouble成员时,我得到1个字节。

3 个答案:

答案 0 :(得分:1)

编译器列出了 speed 的类内部和其他因素,不一定是节省空间,所以它可能会留下一个空的4字节块 - 大小 - 在拟合下一个元素之前的4个元素。这使得在现代体系结构(基于64位= 8字节)上更快地访问下一个元素。

另外,请注意,类对象的sizeof可能包含您不知道的其他数据,例如指向虚函数表的指针等。这是编译器的工作,并且无论何时生成最终代码都是正确的正确而快速地运行。

答案 1 :(得分:1)

只要POD类与C结构兼容,类中字段的布局就是实现定义的。但是,即使在C structs实现中,由于各种原因(如性能)也会添加填充。因此,您的编译器可能会在int字段之后添加四个字节的填充,以使double字段以8字节对齐的地址开始。

如果您特别需要这样做,那么有一些方法可以控制类/结构的对齐和填充,这在编译器之间有所不同。例如,GCC具有类似于__attribute__((packed))的语法,将删除该填充。这很少是必要的 - 主要是当结构需要映射到设备寄存器时 - 并且通常会损害性能,所以尽可能避免使用它。

答案 2 :(得分:0)

编译器将成员打包到类中的默认方式是尝试与字边界对齐,即字的大小的倍数(64位机器上的8个字节)。要停止打包,请使用#pragma pack(1)或编译器选项/Zp。这迫使编译器将成员压在一起。

不允许类具有零大小,因为这可能意味着指向两个不同对象的指针是相同的,因此它的最小大小为1个字节。