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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了具有虚函数的类的大小增加了额外的4个字节相关的知识,希望对你有一定的参考价值。

    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字节。

有人可以解释原因吗?

答案

我假设您正在64位机器上进行编译,因为int的大小是4bytes。典型的64位机器指针大小将是8个字节,int大小是4个字节。为了满足Data Alignment requirement保存读取周期,编译器增加额外的4个字节(填充)因此结果是实际所需大小为12字节的16字节。

以上是关于具有虚函数的类的大小增加了额外的4个字节的主要内容,如果未能解决你的问题,请参考以下文章

为啥 vptr 存储为具有虚函数的类的内存中的第一个条目?

声明具有所有虚函数的类的对象

g++不能对具有虚拟方法的类的实例的运行时大小进行更多优化吗?

如何能避免在调用子类对象的虚函数时调用父类的虚函数呢?

关于虚函数,类的内存分布以及类的成员函数调用原理

sizeof(类)