一个非内联非虚拟方法向类的实例添加了多少字节?C++
How many bytes does a non-inline non-virtual method add to the instance of a class? C++
以这两个类为例(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++中,类函数在内存中的位置?
相关文章:
- 在C++中将类实例添加到对象层次结构中的问题
- 为什么自删除的全局 Vulkan 实例仅在添加层时才导致段错误?
- 将内存文件添加到 clang 编译器实例
- 我可以将一个套接字添加到多个 epoll 实例吗?
- 添加无模板实例化的访问者方法
- 对成员变量的引用在向同一向量中添加另一个实例后断开
- 将类的每个实例添加到列表对象的构造函数
- 创建 QQuickItem 子类的实例是否有问题,我不打算渲染或添加到 QML 树中的实例?
- 将类的实例传递给另一个构造函数,该构造函数将其对象添加到所传递实例所拥有的列表中
- C 将条目添加到具有字符串和类实例的STL映射中,作为指针
- 将类C++实例转换为 NSObject,然后添加到 NSMutableArray
- 将从接口派生的类的实例添加到接口指针数组中
- 一个非内联非虚拟方法向类的实例添加了多少字节?C++
- 为什么我的课'当我向向量添加实例时,会调用s析构函数
- 在 C++ 中将"this"添加到类实例化的向量
- 将解码实例添加到可以调用主类的类中
- 使用MSXML 6.0向SAXXMLReader60实例添加模式集合
- 优雅地重用将const添加到类实例化中的代码
- 在工作精灵系统中添加实例的问题
- Boost::带有函数模板的Python类:如何从外部添加实例