一个非内联非虚拟方法向类的实例添加了多少字节?C++

How many bytes does a non-inline non-virtual method add to the instance of a class? C++

本文关键字:添加 实例 多少 C++ 字节 方法 一个 虚拟      更新时间:2023-10-16

以这两个类为例(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指针,指向每个类的一个表,这样它就可以查找它的方法,这是有意义的,但我不知道这种情况是否适用于非虚拟方法。

谢谢。

编辑:感谢所有令人敬畏的快速回复:)(也标记了答案)

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

对于virtual方法,只有添加到类中的第一个方法会增加其大小,而所有后续方法都不会。

它是否为inline也不会影响类大小。

原因是不需要额外的内存。想象一下,如果所有类的所有实例都持有指向该类中所有方法和所有父类的指针。那将是对记忆的巨大浪费。

B2 b;
b.f0();

编译器可以简单地生成代码来调用CCD_ 7。this指针作为隐藏参数传递,以便方法知道要在类的哪个实例上操作。

对于一个简单的测试:

class B1 {
public:
};
class B2 {
public:
  void f0 () {}
  void f1 () {}
};
//...
assert( sizeof(B1) == sizeof(B2) );

Luchian的答案是正确的。我只想补充一点,代码保留在text段上,这与数据所在的位置(data段)不同。因此,方法影响对象大小的唯一时间是当存在(至少一个)虚拟方法时,从而强制将vptr放置在对象内部(对于每个实例)。阅读本文以获得更多关于分段部分的启示:在C++中,类函数在内存中的位置?