![]() |
1
3
虚拟函数和函数指针都有相同的性能问题。 首先,编译器通常无法内联这些调用。一般来说,编译器必须进行真正的函数调用并承担副作用,所以许多优化技术无法执行。通常,影响是相当大的。 其次,在代码执行期间,CPU通常无法通过指针调用预取代码,因为它不知道执行将转移到哪里。然而,与分支预测器类似,硬件调用设备化器尝试根据过去的性能推测性地预取指令,并且在多次调用之后,它们都得到了培训,并在那里做得很好。然而,缺乏内联仍然会让你头疼。 |
![]() |
2
1
如果不希望性能受到影响,可以使用 CRTP :
现场示例: https://onlinegdb.com/SJzxbtqjz 然而,这可能不是您想要的-这完全取决于您的用例,我无法从您的问题中判断出来。确保您阅读了我上面链接的维基百科页面上的陷阱部分:
编辑: 否则,您将需要按照您的建议进行操作,并付出通过函数指针的代价。然而,如果您调用的函数不是很简单,那么您可能不会看到性能上的差异。 编辑2:
编译器将完全内联调用
GCC 7.3带有-O2优化标志,代码更简单(只是为了避免
不会为类生成代码
|
![]() |
3
0
模板解决方案:
结果:
|
![]() |
4
0
带参考和模板的解决方案。
它比模板更好,因为方法
结果:
|
|
simply lemon · python上链表的添加方法 1 年前 |
|
Anonymous · 为什么在这个例子中self和类名的用法不同? 1 年前 |
![]() |
P N Singh · 在CPP Oops中调用对象而不创建它 1 年前 |
![]() |
Muthuraj · 如何创建一个通用工厂来创建某种类型的实例[重复] 1 年前 |
![]() |
Andy Votava · 从父类定义调用学生方法 1 年前 |