首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候"inline“是无效的?(C格式)

什么时候"inline“是无效的?(C格式)
EN

Stack Overflow用户
提问于 2009-02-24 18:21:50
回答 8查看 1.7K关注 0票数 15

有些人喜欢在C中使用inline关键字,并将大函数放在头文件中。你什么时候认为这是无效的?我认为它有时甚至令人讨厌,因为它是不寻常的。

我的原则是,inline应该用于非常频繁访问的小函数,或者为了进行真正的类型检查。无论如何,我的品味指导着我,但我不确定如何最好地解释为什么inline对于大型函数不是那么有用。

this question中,人们建议编译器可以更好地猜测要做的正确的事情。这也是我的假设。当我尝试使用这个参数时,人们回答说它不适用于来自不同对象的函数。嗯,我不知道(例如,使用GCC)。

感谢您的回答!

EN

回答 8

Stack Overflow用户

发布于 2009-02-24 18:26:41

关于内联声明的重要一点是,它不一定要做任何事情。在许多情况下,编译器可以自由地决定内联未如此声明的函数,以及链接内联声明的函数。

票数 5
EN

Stack Overflow用户

发布于 2009-02-24 21:27:42

一个例子来说明内联的好处。sinCos.h:

代码语言:javascript
复制
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会显示如下内容:

代码语言:javascript
复制
;*----------------------------------------------------------------------------*
;*   SOFTWARE PIPELINE INFORMATION
;*      Disqualified loop: Loop contains a call
;*----------------------------------------------------------------------------*

当您使用内联进行编译时,编译器知道循环中发生了什么,并且会进行优化,因为它确切地知道正在发生什么。

输出.asm将具有优化的“流水线”循环(即,它将尝试充分利用处理器的所有all,并尝试在没有NOPS的情况下保持处理器的流水线已满)。

在这个特定的例子中,我能够将我的性能提高大约2倍或4倍,这让我在实时截止日期内达到了我所需要的。

附注:我在做一个定点处理器...任何像sin/cos这样的浮点运算都会毁了我的性能。

票数 5
EN

Stack Overflow用户

发布于 2009-02-25 09:56:36

不应该对大型函数使用内联的另一个原因是在库的情况下。每次更改内联函数时,都可能会失去ABI兼容性,因为根据旧的头文件编译的应用程序仍然内联了旧版本的函数。如果将内联函数用作类型安全宏,则该函数在库的生命周期中不需要更改的可能性很大。但对于大型函数,这很难保证。

当然,只有当函数是您的公共API的一部分时,此参数才适用。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/582919

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档