【问题标题】:Why does adding virtual method increase class size in C++?为什么添加虚拟方法会增加 C++ 中的类大小?
【发布时间】:2017-04-20 11:26:27
【问题描述】:
#include <iostream>
using namespace std;

class a {
  virtual int foo() {
    return 0;
  }
};

class b {
  int foo() {
    return 0;
  }
};

int main() {
  cout << sizeof(b) << endl;
  cout << sizeof(a) << endl;
}

输出(使用 g++ 4.9,-O3):

1
8

我认为大小的增加是由于添加了 vpointer。但是我认为编译器会看到 a 实际上不是从任何东西派生或派生的,因此不需要添加 vpointer?

【问题讨论】:

  • 它没有被标记为final,那么编译器怎么能看出它不是从另一个文件中派生出来的呢?
  • 我以为开发人员会看到它实际上并没有派生或派生自任何东西,为什么需要在类中添加 virtual 关键字?

标签: c++


【解决方案1】:

需要 vpointer 是因为编译器无法保证外部(例如共享)库不使用派生类型。派生类的存在性解析发生在运行时。

【讨论】:

  • 想象一下,如果该文件包含int j (a&amp; bar) { return bar.foo(); }——编译器将如何使其工作?
  • 这是一个反问句吗?
  • 是的。我的观点和你的一样——编译器不知道它看不到的代码可能会做什么。
【解决方案2】:

运行时类型信息。任何多态类都会在程序中创建额外的元数据,以使 typeofdynamic_cast 之类的东西工作。这是对虚函数表的补充。

【讨论】:

    猜你喜欢
    • 2019-10-11
    • 2014-04-30
    • 2018-11-12
    • 1970-01-01
    • 1970-01-01
    • 2010-12-28
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多