【问题标题】:Size of class with virtual function adds extra 4 bytes具有虚函数的类的大小增加了额外的 4 个字节
【发布时间】:2021-10-17 20:56:50
【问题描述】:
    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;
}

输出为:

非虚拟:4
无效*:8
OneVirtual:16
两个虚拟:16

问题是:

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

谁能解释一下原因?

【问题讨论】:

标签: c++ polymorphism


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 2014-04-02
    • 2011-10-16
    • 2016-05-30
    • 1970-01-01
    • 2021-12-20
    • 2017-03-18
    • 1970-01-01
    相关资源
    最近更新 更多