2013-07-12 26 views
0

我有一个简单的方程式,需要在整个代码中调用大约100次。我试图将函数开销降到最低,但仍然使用OOP概念(这对我来说是新的)。该公式只是一个简单的计算两个差异的最大值。它就像3条线。我应该使用内联函数吗?如果是这样,通常使用它的接受方式是什么(即,我应该创建一个单独的.h文件,将它放在一个基类中(所有使用此函数的对象都是间接派生的)在OOP中内联函数的正确方法C++

+1

香草萨特在内联:http://www.gotw.ca/gotw/033.htm --- http://www.drdobbs.com/inline-redux/184403879 –

+0

顺便说一句,我应该指出,如果你只是在学习C++,你不应该担心性能太多,性能几乎是内联的唯一原因。还要注意,'inline'关键字只是编译器的一个提示,编译器可以自由地不内联某些东西,甚至可以内联你没有明确要求内联的东西。 –

+1

“inline”关键字在C++中不是“提示”。它甚至与优化没有任何关系。这只是一种绕过[一个定义规则](http://stackoverflow.com/questions/4192170/what-exactly-is-one-definition-rule-in-c)的方式,指示链接器接受多个定义功能。 –

回答

2

除非您的编译器具有良好的链接时间优化功能(并且它们已启用),否则必须在头文件中声明并定义要内联的整个函数。至于将.h文件专门用于内联函数,或者将它放在类层次结构中,我们甚至不会告诉您,即使您向我们提供了其他代码和/或设计。对于唯一正确的方法来说,它比预先定义的规则更像是一种风格选择。

编辑:澄清:如果您的内联函数将只用于单一来源(.cpp)文件,您可以在与static inline相同的文件中声明它。如果您希望可以访问多个源文件,请将其放入一个头文件中。

+0

谢谢,这回答了我的问题的一部分。我唯一的另一个问题是如何保证函数将被内联......我认为这在inline关键字的范围内是不可能的。正确? – user2079828

+1

几乎没有什么可以保证函数是内联的。编译器可能有'force_inline'或'always_inline'扩展名,但这并不是正确的做法。如果编译器不真的想要内联函数,那么这可能是一个很好的理由! –

+0

所以基本上,我必须#定义获得这个功能,或将代码复制到每个使用它的地方? – user2079828

1

是的,您可以使用inline函数成员如果它们不是virtual但是在使用这个内联函数的每个文件中都应该存在它的定义,所以把这个函数的实现放在* .h文件中是一个好主意,如果它是虚拟的,你不能使用内联根据标准(虽然GCC允许)

但在任何情况下的标准并不能保证你的内联函数。 - 即使你把它标记为inline

+1

您仍然可以通过'virtual'功能使用'inline'。它可能会降低编译器内联函数的概率(“内联”是一个提示,而不是保证)。但是,如果编译器静态地知道呼叫站点的实际类型,它确实允许编译器内联虚函数。 –

+0

我不明白'提示'的概念给编译器。必须定义编译器何时或不会内联赋予关键字....的函数,否则它是无用的。 – user2079828

+0

@ user2079828,嗯......但没有。编译器决定自己,如果它看到内联生成的函数会变得更慢或无用,它就不会定义它。 –

1

我不会把这样的函数放在类中,除非它需要使用类的某些状态,或者如果有一些很好的理由将它的使用限制在该类的层次结构中。

在.h中名称空间内的内联函数听起来像是一个好方法。通过将它放在名称空间中,您可以使用通用名称max,而不用担心它在全局名称空间中,然后可以收集适合该域的任何函数。

尽管如果它只是一个最大功能,也许只是使用std::max function将是一个不错的选择?

一般来说,如果可能,最好重用。它节省了时间并降低了维护成本。每个人都很清楚std :: max是什么,但其他一些max需要一些搞清楚。

+0

最大值函数只是另一个函数的一部分。另一个功能是针对所有不同的122个对象实现的。它们具有相同的继承功能,但必须以不同的方式实施。最大函数是其中每一个都是相同的一部分。 – user2079828

+0

当你说你有122个对象时,你是否意味着你实现了122个不同的类?这听起来像一个非常复杂的类层次结构! – PeterSW

+0

是的。这不是我的选择。每个对象都来自同一个数据集,但必须根据中间类型设置数据,然后针对每个对象有三种类型的操作。 @PeterSW:我不能使用它。无论哪种方式,只需使用我自己的时间,多少时间就可以节省下来? – user2079828