通过内联降低抽象层的成本

时间:2013-03-02 11:56:39

标签: c++ interface abstraction

在我的项目中,我有一些像这样的抽象层:

 Vector3 normalizeVector(Vector3 v);

 Vector3 vectorMultiplyMatrix(Vector3 v, Matrix3 m);

这些只是平台特定数学库(如DirectXMath)的“代理”功能。

我的问题是如何降低这些图层的成本?通过内联所有这些功能,可以完全消除调用它们而不是直接调用平台特定功能的成本吗?

由于

2 个答案:

答案 0 :(得分:4)

在另一个函数调用中捆绑一堆函数调用的意义上添加新抽象级别(代理,外观等)的成本可以忽略不计。将数据传递给它们的方式可能会给您带来麻烦,尤其是在使用复杂对象,容器等时。

Vector3 normalizeVector(Vector3 v);

在每次调用时创建传递的Vector3对象的副本。如果您遇到性能问题,请通过将传递值改为传递const引用来避免创建副本:

Vector3 normalizeVector(const Vector3& v);

此函数的这个新原型表示:“我需要引用现有的有效Vector3对象,我将使用但不会更改”

除非您真的遇到性能问题,否则不要优化代码。 过早优化一直都是邪恶的,而且永远都是。

答案 1 :(得分:1)

公开函数体将为编译器提供机会,以通过内联消除函数调用。

它是否真的需要它取决于它的内部启发式:内联可能会扩大生成的代码的整体大小,使其对缓存不太友好,并最终否定消除调用的好处。

您可以使用特殊关键字(例如VC ++下的__forceinline)来覆盖编译器的成本/收益分析,但编程人员通常比编程人员对这些决策更合适!

使用profile-guided optimization可以帮助编译器根据程序的实际使用模式做出更好的优化决策,包括哪些函数“热”足以内联,哪些函数“冷”并且应该单独使用。 / p>


要记住的一个特别有效的技术是template metaprogramming。我们的想法是尽可能多地计算编译时间。