我考虑在实时应用程序中使用虚继承。使用虚继承是否会像调用虚函数一样对性能产生影响?所涉及的对象仅在启动时创建,但我担心是否所有来自层次结构的函数都将通过vtable进行分派,还是只有来自虚基类的函数。
我正在考虑在实时应用程序中使用虚继承。使用虚继承是否会像调用虚函数一样对性能产生影响?所涉及的对象仅在启动时创建,但我担心是否所有来自层次结构的函数都将通过vtable进行分派,还是只有来自虚基类的函数。我考虑在实时应用程序中使用虚继承。使用虚继承是否会像调用虚函数一样对性能产生影响?所涉及的对象仅在启动时创建,但我担心是否所有来自层次结构的函数都将通过vtable进行分派,还是只有来自虚基类的函数。
我正在考虑在实时应用程序中使用虚继承。使用虚继承是否会像调用虚函数一样对性能产生影响?所涉及的对象仅在启动时创建,但我担心是否所有来自层次结构的函数都将通过vtable进行分派,还是只有来自虚基类的函数。额外说明:请查看Stan Lippmann的深入理解C++对象模型,该书对这些问题进行了很彻底的回答。
B::f()
),要么通过派生类的虚表动态分派,就像非虚基类的成员函数一样。以我之见。 - sbithis
指针,对吗? - James McNellisthis
指针的调整。但这是由于_多重_继承,无论是虚拟的还是非虚拟的,还是有其他我忘记的额外成本吗? - sbithis
指针。在虚拟多重继承中,您必须去查找(在运行时)基类子对象的位置以获取this
指针。查找比加法“更昂贵”,但该差异的相关性取决于应用程序:正如您所说;除非这是具有实时性能约束的程序中的时间关键操作,否则不会有影响。 - James McNellis请看以下在OOPSLA'96上发表的大规模实验研究。我复制粘贴了一条bibtex条目、摘要和论文链接。我认为这是迄今为止关于这个主题最全面的实验研究。
@article{driesen1996direct,
title={{The direct cost of virtual function calls in C++}},
author={Driesen, K. and H{\\"o}lzle, U.},
journal={ACM Sigplan Notices},
volume={31},
number={10},
pages={306--323},
issn={0362-1340},
year={1996},
publisher={ACM}
}
摘要:
我们研究了C++程序中虚函数调用的直接成本,假设使用虚函数表的标准实现。我们通过可执行文件检查和处理器模拟的组合来实验测量了许多大型基准程序的开销。我们的结果显示,所测量的C++程序在分派代码中花费的时间中位数为5.2%,指令中花费的时间中位数为3.7%。对于程序的“所有虚函数”版本,中位数开销升至13.7%(指令的13%)。虚函数表实现的“thunk”变体相对于标准实现将开销中位数降低了21%。在未来的处理器上,这些开销可能会适度增加。
你确定你要使用虚拟继承吗?如果是这样,它与普通虚函数调用的成本相同。vtable链接搜索只是按照指定路径进行。
你说这是在启动时。你的磁盘开销(仅从将代码加载到内存中)很可能需要比vtable查找的半打指令花费更多的时间数量级。如果你能够对其进行分析并检测出差异,我会感到有些惊讶。
不需要检查编译或运行时的详细信息,基于我的测试使用 GNU C++17,在虚拟基类中访问数据成员不会对性能产生影响。