非内联非虚方法添加到类的实例的字节数是多少?C++

mma*_*aid 2 c++ memory vtable

以这两个类为例.(C++)

class B1 {
public:

};

class B2 {
public:
  void f0 () {}
  void f1 () {}
};
Run Code Online (Sandbox Code Playgroud)

B2类在内存中与B1相比会有多大

我觉得这是两个答案中的一个.

32位系统PER方法上的单个4字节int指针.

或类似于虚拟方法表http://en.wikipedia.org/wiki/Virtual_method_table所发生的事情

哪里会有一个4字节的int指针指向每个类的表,所以它可以查找它的方法,这是有道理的,但我不知道这是否适用于非虚方法.

谢谢.

编辑:感谢所有的精彩和快速回复:)(也标记答案)

Luc*_*ore 8

没有.

非虚方法不会增加类的大小.

至于virtual方法,只有添加到类中的第一个会增加它的大小,所有后续的都不会.

它是否inline也不会影响班级规模.

原因是不需要额外的内存.试想一下,如果所有类的所有实例都保存了指向类中所有方法和所有父类的指针.这将是对记忆的巨大浪费.

B2 b;
b.f0();
Run Code Online (Sandbox Code Playgroud)

编译器可以简单地生成要调用的代码B2::f0().该this指针被作为下引擎盖参数传递,以便该方法知道对类进行操作的哪个实例.

对于一个简单的测试:

class B1 {
public:

};

class B2 {
public:
  void f0 () {}
  void f1 () {}
};

//...
assert( sizeof(B1) == sizeof(B2) );
Run Code Online (Sandbox Code Playgroud)