代码大小:头文件中定义的函数的静态内联与内联

the*_*ife 6 c static inline code-size

我已经阅读了很多关于在头文件中使用static inlineinline定义函数的文章,以便跨多个翻译单元进行访问.inline由于有外部联系,似乎是正确的方法.

我的问题是inline在.h文件中定义函数时使用说明符导致的结果代码大小:

  • 生成的代码扩展是否inline仍然比引起的更小static inline

  • 为什么extern inline在相应的.c文件中需要声明?

Ulf*_*zer 5

它可以生成更小的代码.原因是inline(相对于static inline)将赋予函数外部链接,以便来自不同转换单元的对函数的所有调用都引用相同的逻辑函数.使用时static inline,每个转换单元将获得该函数的唯一实例,如果编译器选择不内联,则可能会增加代码大小.(代码更清晰,没有多个相同的功能.)

你需要extern某个地方的原因是因为它使编译器生成可以从其他翻译单元调用的函数的外部定义.没有extern,没有生成这样的实例.无extern例与内部联系的不同之处在于,inline定义仅提供了对函数外部定义的"替代".外部定义必须仍然存在(即,某些转换函数必须用于extern生成外部定义),并且编译器可以自由地使用它而不是它想要的.

这里有一些相关的标准(对于C11:ISO/IEC 9899:2011§6.7.4函数说明符,7):

具有内部链接的任何函数都可以是内联函数.对于具有外部链接的函数,以下限制适用:如果使用inline函数说明符声明函数,则它也应在同一转换单元中定义.如果转换单元中函数的所有文件范围声明都包含inline函数说明符extern,则该转换单元中的定义内联定义.内联定义不提供函数的外部定义,也不禁止另一个转换单元中的外部定义.内联定义提供了外部定义的替代,翻译器可以使用该定义在同一翻译单元中实现对该功能的任何调用.未指定对函数的调用是使用内联定义还是使用外部定义.140)

140)由于内联定义不同于相应的外部定义以及其他翻译单元中的任何其他相应内联定义,因此具有静态存储持续时间的所有相应对象在每个定义中也是不同的.

顺便说一句,inlineIMO通常不值得(作为一个提示 - 编译器仍然可以自由不内联),而不是简单地让编译器选择何时纯粹内联.对于支持链接时优化的现代编译器,如果传递正确的标志(例如,-flto在GCC中),编译器甚至可以跨翻译单元内联函数.