我应该在频繁使用的函数上使用`inline`吗?

5

我有一个名为cnVector的类,代表三维空间中的一个点。 它的运算符+ - * / 被广泛使用。
它们的实现非常简短:

cnVector cnVector::operator + (const cnVector& v) const {
    return cnVector(
        x + v.x,
        y + v.y,
        z + v.z );
}

我的问题是,由于这个函数非常简短,我是否应该内联它,尽管它的使用非常频繁?或者当使用它时,会生成太多的代码吗?


1
我将这样简单的函数标记为inline。不过这并不重要,如果您告诉编译器内联看起来不错的任何函数。在MSVC上“内联任何合适的函数”。至于GCC,我不知道。 - Mooing Duck
2
GCC传递-finline-functions将指示它自动内联函数,以便它认为应该内联的函数。 - Andrew Marshall
2
我的GCC(4.4.5)应用“-finline-small-functions”作为基本优化(即在“-O”/“-O1”及更高级别下)。 - Frédéric Hamidi
当你说“频繁使用”时,请确保你知道你是指a)在代码中使用的地方很多,还是b)每秒使用的次数足以占用>10%的时间。后者支持内联,而前者则不支持。 - Mike Dunlavey
5个回答

5

5

请记住,使用inline永远不是一种保证,它只是给编译器一个提示。我怀疑内联实际上不会显著增加可执行文件的大小,因为函数本身非常小。
调用该函数的大小几乎与函数本身相同。


3
应用 inline 到您在命名空间范围内定义的所有函数中,以避免违反一次定义规则。 顺便说一下,这完全与内联无关,尽管关键字名称相同。(或将它们放在匿名命名空间中。) inline还提示编译器内联调用该函数,但是正如注释指出的那样,编译器可以很好地自行解决这个问题,因此实际上不需要关键字。

2

编译器可以根据所选的优化配置决定是否内联函数。

如果编译器没有内联函数,而使用真实数据集进行分析后发现在该函数中花费了大量时间,使用该函数的算法是高效的,并且通过将其内联来提高基准测试速度,则应该内联该函数。


1

如果有疑问,可以编译带有和不带有内联的代码,并比较执行速度和大小。编译器通常提供一个开关来进行性能分析,如上所述,以查看函数调用的成本,以时间为单位计量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接