在c++中使用多态性和函子实现快速性能

achieving fast performance using polymorphism and functors in c++

本文关键字:实现 性能 c++ 多态性      更新时间:2023-10-16

我目前正在用c++编写一个Maya 2013插件,该插件可以针对特定约束优化给定网格的几何体。我需要达到最佳表现。目前,我只为特定的约束实现了该算法的硬编码版本,它非常快,但我需要为任何给定的约束实现该算法的一些通用实现(因此我需要某种多态性)。

一个伪代码用于算法的一般结构是:

(1) do k times:
(2)      for every face fj in the mesh do: 
(3)            some manipulation on the vertices qi incident to the face fj
(4)      for every vertex  vi in the mesh do: 
(5)            some manipulation  on the faces fj incident to the vertex vi 

问题是,在我的具体实现中,伪代码中没有函数调用步骤3和5中的计算,当我尝试使用辅助函数计算这些步骤时,性能大大降低。

对于通用实现,我需要在步骤3和5中为每个约束进行函数调用。

我想到了两种解决方案:

  1. 为约束编写一个泛型类。用算法中第3步和第5步的计算方法为我需要的每个约束派生类
  2. 编写一个通用函子(只包含()运算符的类),并从中导出用于计算步骤3和5的函子。产生这种想法的原因是对函子中()运算符的调用是内联的(关于此链接中可重用代码的答案)

第一个问题

有什么方法可以减少函数调用的开销吗?

第二个问题

有什么方法可以使编译器始终内联中的函数吗以上两种解决方案?从这个问题我知道虚拟从指向对象的指针调用的函数不能内联。

第三个问题

有没有比我提出的解决方案更有效的方法?

我建议您查看模板并将模板函数/函子作为参数传递
使用动态多态性,您几乎总是可以间接调用函数,即编译器不知道函数的主体,因此优化选项有限。模板允许您执行所谓的静态多态性。

查看这些链接了解更多信息:

静态多态性定义与实现

C++模板的性能?