具有虚函数的类的大小增加了额外的4个字节

时间:2017-12-25 11:52:35

标签: c++ polymorphism

    class NoVirtual {
        int a;
    public:
        void x() const {}
        int i() const { return 1; }
    };

    class OneVirtual {
        int a;
    public:
        virtual void x() const {}
        int i() const { return 1; }
    };

    class TwoVirtuals {
        int a;
    public:
        virtual void x() const {}
        virtual int i() const { return 1; }
    };

    int main() {
        cout << "int: " << sizeof(int) << endl;
        cout << "NoVirtual: "
             << sizeof(NoVirtual) << endl;
        cout << "void* : " << sizeof(void*) << endl;
  cout << "OneVirtual: "
       << sizeof(OneVirtual) << endl;
  cout << "TwoVirtuals: "
       << sizeof(TwoVirtuals) << endl;

    return 0;
}

输出为:

NoVirtual:4
无效*:8
OneVirtual:16
TwoVirtuals:16

问题是:

由于OneVirtual和TwoVirtuals类具有虚函数,因此类的大小应为sizeof(int)+ sizeof(void *),即12bytes。但是大小打印为16字节。

有人可以解释原因吗?

1 个答案:

答案 0 :(得分:3)

我假设您正在64位计算机上进行编译,因为int的大小是4bytes。对于64位计算机,指针大小通常为8字节,int大小为4字节。要满足Data Alignment requirement以节省读取周期 编译器添加额外的4个字节(填充),因此结果是16字节,其中实际所需的大小是12个字节。