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

时间:2012-03-05 19:06:39

标签: c++ memory vtable

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

class B1 {
public:

};

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

B2级别与B1相比会有多大?

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

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

或类似于虚拟方法表http://en.wikipedia.org/wiki/Virtual_method_table

的情况

其中有一个4字节的int指针指向每个类的表,所以它可以查找它的方法,这是有道理的,但我不知道这是否发生在非 - 虚拟方法。

感谢。

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

2 个答案:

答案 0 :(得分:8)

<强>无

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

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

它是inline的事实也不会影响班级规模。

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

B2 b;
b.f0();

编译器可以简单地生成调用B2::f0()的代码。 this指针作为under-the-hood参数传递,以便该方法知道要操作的类的哪个实例。

进行简单的测试:

class B1 {
public:

};

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

//...
assert( sizeof(B1) == sizeof(B2) );

答案 1 :(得分:0)

Luchian的回答是正确的。我只想补充说,代码保存在与数据所在位置不同的文本段(数据段)。因此,方法影响对象大小的唯一时间是它们是虚拟方法,因此强制将vptr放置在对象内。阅读本文以便在细分部分获得更多启发:In C++, where in memory are class functions put?