2011-10-23 65 views
5

我有一个类cnVector,它代表了三维空间中的一个点。 其运营商+ - * /正在密集使用。
它们的实现是很短:我应该在大量使用的函数中使用`inline`吗?

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

我的问题是,因为这个功能是很短的,我应该是内联虽然它的集约利用?或者使用它时会产生太多的代码多少?

+1

我把这个功能标记为内联。不过,如果你告诉编译器内联任何看起来不错的东西,那并不重要。在MSVC上“内联任何适合的”。不知道GCC。 –

+2

GCC通过['-finline-functions'](http://gcc.gnu.org/onlinedocs/gcc/Inline.html)将指示它自动内联它认为应该内联的函数。 –

+2

我的GCC(4.4.5)使用'-finline-small-functions'作为基本的优化(即在'-O' /'-O1'和更高版本下)。 –

回答

5

请记住,使用内联是永远的保证,它只是给出了一个暗示,编译器。我怀疑内联实际上会增加很多可执行文件的大小,本身的功能非常小。
调用函数几乎与函数本身的大小相同。

2

编译器完全可以根据所选优化配置文件来决定是否内嵌函数。

如果编译器不需要内联函数,并且使用实际数据集进行分析表明您在函数中花费了大量时间,则使用该函数的算法是高效的,并且如果内联它显示了与所述数据集的基准速度提高。

1

如果有疑问,可以使用或不使用内联进行编译,并比较执行速度和大小。编译器通常提供了一个开关,用于分析如上mentionend,看看有什么功能通话费用,在时域测量,

3

应用inline您在头定义名称空间范围,以避免破坏One Definition Rule所有功能。顺便说一句,这与内联完全无关,尽管有关键字的名称。 (或把它们放到一个匿名的命名空间里。)

inline给出了一个暗示,编译器内嵌调用说的功能,但由于意见所指出的编译器是完全有能力搞清楚了这一点本身这样的关键字并不是真的需要这个。