为什么添加虚方法会增加C ++中的类大小?

时间:2016-12-05 23:02:40

标签: c++

#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?

2 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:0)

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