有些人喜欢在C
中使用inline
关键字,并将大函数放在头文件中。你什么时候认为这是无效的?我认为它有时甚至令人讨厌,因为它是不寻常的。
我的原则是,inline
应该用于非常频繁访问的小函数,或者为了进行真正的类型检查。无论如何,我的品味指导着我,但我不确定如何最好地解释为什么inline
对于大型函数不是那么有用。
在this question中,人们建议编译器可以更好地猜测要做的正确的事情。这也是我的假设。当我尝试使用这个参数时,人们回答说它不适用于来自不同对象的函数。嗯,我不知道(例如,使用GCC)。
感谢您的回答!
发布于 2009-02-24 18:26:41
关于内联声明的重要一点是,它不一定要做任何事情。在许多情况下,编译器可以自由地决定内联未如此声明的函数,以及链接内联声明的函数。
发布于 2009-02-24 21:27:42
一个例子来说明内联的好处。sinCos.h:
int16 sinLUT[ TWO_PI ];
static inline int16_t cos_LUT( int16_t x ) {
return sin_LUT( x + PI_OVER_TWO )
}
static inline int16_t sin_LUT( int16_t x ) {
return sinLUT[(uint16_t)x];
}
当进行一些繁重的数字运算时,您希望避免在计算sin/cos时浪费周期,您可以用LUT替换sin/cos。
当你在没有内联的情况下编译时,编译器不会优化循环,输出的.asm会显示如下内容:
;*----------------------------------------------------------------------------*
;* SOFTWARE PIPELINE INFORMATION
;* Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*
当您使用内联进行编译时,编译器知道循环中发生了什么,并且会进行优化,因为它确切地知道正在发生什么。
输出.asm将具有优化的“流水线”循环(即,它将尝试充分利用处理器的所有all,并尝试在没有NOPS的情况下保持处理器的流水线已满)。
在这个特定的例子中,我能够将我的性能提高大约2倍或4倍,这让我在实时截止日期内达到了我所需要的。
附注:我在做一个定点处理器...任何像sin/cos这样的浮点运算都会毁了我的性能。
发布于 2009-02-25 09:56:36
不应该对大型函数使用内联的另一个原因是在库的情况下。每次更改内联函数时,都可能会失去ABI兼容性,因为根据旧的头文件编译的应用程序仍然内联了旧版本的函数。如果将内联函数用作类型安全宏,则该函数在库的生命周期中不需要更改的可能性很大。但对于大型函数,这很难保证。
当然,只有当函数是您的公共API的一部分时,此参数才适用。
https://stackoverflow.com/questions/582919
复制相似问题