相关疑难解决方法(0)

虚函数和性能 - C++

在我的类设计中,我广泛使用抽象类和虚函数.我感觉虚拟功能会影响性能.这是真的?但我认为这种性能差异并不明显,看起来我正在做过早的优化.对?

c++ optimization performance virtual-functions

117
推荐指数
8
解决办法
6万
查看次数

CRTP避免动态多态

如何在C++中使用CRTP来避免虚拟成员函数的开销?

c++ virtual templates crtp

88
推荐指数
3
解决办法
3万
查看次数

你能用C++缓存虚函数查找吗?

假设我在抽象基类指针mypointer-> foo()上有一个虚函数调用foo().当我的应用程序启动时,根据文件的内容,它选择实例化一个特定的具体类,并将mypointer分配给该实例.对于应用程序的其余部分,mypointer将始终指向该具体类型的对象.我无法知道这个具体类型是什么(它可以由动态加载的库中的工厂实例化).我只知道在第一次生成具体类型的实例后,类型将保持不变.指针可能并不总是指向同一个对象,但该对象将始终具有相同的具体类型.请注意,类型在技术上是在'运行时'确定的,因为它基于文件的内容,但是在'启动'(加载文件)之后,类型是固定的.

但是,在C++中,每次在应用程序的整个持续时间内调用foo时,我都会支付虚函数查找成本.编译器无法优化查找,因为它无法知道具体类型在运行时不会发生变化(即使它是有史以来最令人惊奇的编译器,也无法推测动态加载的行为库).在JIT编译语言(如Java或.NET)中,JIT可以检测到反复使用相同类型并执行内联缓存.我基本上是在寻找一种方法来手动为C++中的特定指针执行此操作.

在C++中是否有任何方法可以缓存此查找?我意识到解决方案可能非常糟糕.我愿意接受ABI /编译器特定的黑客攻击,如果有可能编写发现ABI /编译器相关方面的配置测试,那么即使不是真正可移植的,它也"实际上是可移植的".

更新:对反对者:如果这不值得优化,那么我怀疑现代JIT会做到这一点.您是否认为Sun和MS的工程师正在浪费时间实施内联缓存,并没有对其进行基准测试以确保有所改进?

c++ optimization abstract-class caching virtual-functions

35
推荐指数
3
解决办法
6011
查看次数

加速gcc中的虚函数调用

使用gprof分析我的C++代码,我发现我的大部分时间花在一遍又一遍地调用一个虚拟方法上.该方法本身很短,如果它不是虚拟的,可能会内联.

有什么方法可以加快这一点,而不是将其重写为不是虚拟的?

c++ virtual-functions gprof

5
推荐指数
5
解决办法
2399
查看次数