3

我目前正在用 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 的仿函数。这个想法的原因是仿函数中对 () 运算符的调用是内联的(关于可重用代码的答案在这个链接)。

第一个问题

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

第二个问题

有没有办法让编译器总是内联上述两种解决方案中的函数?从这个问题我知道从指向对象的指针调用的虚函数不能被内联。

第三个问题

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

4

1 回答 1

1

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

有关更多信息,请参阅这些链接:

静态多态性定义与实现

用于性能的 C++ 模板?

于 2013-08-29T03:09:16.023 回答