虚拟继承是否会增加开销
Does virtual inheritance add overhead
假设我有这个类:
class A{
};
和这个派生的类:
class B : public virtual A{
};
,然后再也没有源自B
。
声明B
是否需要在那里添加虚拟添加开销?
我认为虚拟继承可能需要少量额外的开销,尽管这可能取决于编译器如何实现非虚拟继承。
正常的继承可以通过简单地将派生类的成员串联到基类(类似于将基类作为派生类的第一个成员)来实现。访问基类的成员是与对象开头的简单偏移,就像访问派生类的成员一样。
。但是,通过虚拟继承,必须通过指针有间接。这允许几乎从同一基础继承的所有类都对基类的共享数据有指示。因此,访问基类的成员需要首先索引虚拟指针,将其索取,然后索引到成员的偏移。
即使没有进一步的派生,该开销也必须在派生类中,因为编译器无法确定您是否可以在与此类链接的其他一些编译单元中进一步派生。可以想象,它可以使用一些链接器魔术与代码不同版本的链接,具体取决于是否有进一步的推导。但这意味着以B
的两个版本的形式以其自身的开销。
有关其他详细信息,请参阅多个和虚拟继承的内存布局。
是。访问虚拟基类的成员时,涉及间接。
相关文章:
- 数组索引的值没有增加
- 实现无开销push_back的最佳方法是什么
- 为什么我的代码在输出中增加了93天
- 有效地使用std::unordered_map来插入或增加键的值
- C++ 动态数组每次添加时将大小增加 1 - 错误
- 为什么要增加导致崩溃的指针
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- 类型擦除的std::function与虚拟函数调用的开销
- 一组值的零开销下标运算符
- 增加传递地址的值
- C++ 特征库:引用的性能开销<>
- 如何增加以前由新运算符分配的 C++ std::list 数组的大小?
- 为什么"i"在循环的每次迭代中都没有增加?(C++)
- 虚拟继承是否会增加开销
- 为变量创建局部别名会增加开销吗?
- 如何添加易于在需要时打开和关闭的日志,而不增加生产开销
- 当num_threads变化时,OpenMP并行区域开销增加
- 静态成员函数会给类增加一个开销
- 'final'说明符会增加任何开销吗?