静态内联 vs 内联静态
static inline vs inline static
我注意到两者都有效,在这里使用 inline 的正确方法是什么?
static inline int getAreaIndex()
或
inline static int getAreaIndex()
此外,getAreaIndex 包含一个大循环。有时我只调用它,有时我通过循环调用它,我应该内联它吗? (它有 10 行高)
函数说明符(例如 inline
)和存储 class 说明符(例如 static
)可以作为函数声明的一部分以任何顺序出现。
所以上面两个例子的意思完全一样。
至于是否应该inline
,具体实现的细节inline
定义。所以你应该查看你的编译器的文档。
来自 C 标准(6.7 声明)
declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
alignment-specifier declaration-specifiersopt
这意味着您可以按任何顺序指定声明说明符。
例如,下面显示的所有函数声明都声明了同一个函数。
#include <stdio.h>
static inline int getAreaIndex( void );
inline static int getAreaIndex( void );
int static inline getAreaIndex( void );
static int inline getAreaIndex( void );
inline int static getAreaIndex( void )
{
return 0;
}
int main(void)
{
return 0;
}
至于内联函数说明符则根据C标准(6.7.4函数说明符)
6 A function declared with an inline function specifier is an inline
function. Making a ∗function an inline function suggests that calls to
the function be as fast as possible.138)The extent to which such
suggestions are effective is implementation-defined.
还有一个脚注
139) For example, an implementation might never perform inline
substitution, or might only perform inline substitutions to calls in
the scope of an inline declaration
注意函数参数要指定void
。否则,编译器将决定参数的数量和类型是从函数调用中推导出来的。
What is the correct way to use inline here
static inline
和 inline static
都是允许的,它们的意思是一样的。 static inline
是首选,因为像 static
这样的“存储 class 说明符”总是应该在声明中排在第一位(参见 C11 §6.11.5)。
should I inline this function
要回答这个问题,您需要对您的程序进行两种方式的基准测试,并找出哪个更快。
目前它们在功能上是等价的,但是 static inline
是编写 C 的正确方法。这是因为 C17 已经使其他样式过时和不好的做法:
6.11.5 Storage-class specifier
The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.
static
是“存储 class 说明符”。
should I inline it?
内联只是对编译器的提示,如果对性能影响太大,编译器可以随意忽略它。
此外,对于本地定义的函数(在同一个 .c file/translation 单元中),编译器可以自由决定内联一个函数,即使它没有被标记为这样。
在大多数情况下,对于headers中未定义的static
函数,我认为最好不要指定inline
,让编译器在其认为合适的情况下内联函数, 根据您提供的优化选项 (-O<n>
, -Ofast
, -Osize
).
我注意到两者都有效,在这里使用 inline 的正确方法是什么?
static inline int getAreaIndex()
或
inline static int getAreaIndex()
此外,getAreaIndex 包含一个大循环。有时我只调用它,有时我通过循环调用它,我应该内联它吗? (它有 10 行高)
函数说明符(例如 inline
)和存储 class 说明符(例如 static
)可以作为函数声明的一部分以任何顺序出现。
所以上面两个例子的意思完全一样。
至于是否应该inline
,具体实现的细节inline
定义。所以你应该查看你的编译器的文档。
来自 C 标准(6.7 声明)
declaration:
declaration-specifiers init-declarator-listopt ;
static_assert-declaration
declaration-specifiers:
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
function-specifier declaration-specifiersopt
alignment-specifier declaration-specifiersopt
这意味着您可以按任何顺序指定声明说明符。
例如,下面显示的所有函数声明都声明了同一个函数。
#include <stdio.h>
static inline int getAreaIndex( void );
inline static int getAreaIndex( void );
int static inline getAreaIndex( void );
static int inline getAreaIndex( void );
inline int static getAreaIndex( void )
{
return 0;
}
int main(void)
{
return 0;
}
至于内联函数说明符则根据C标准(6.7.4函数说明符)
6 A function declared with an inline function specifier is an inline function. Making a ∗function an inline function suggests that calls to the function be as fast as possible.138)The extent to which such suggestions are effective is implementation-defined.
还有一个脚注
139) For example, an implementation might never perform inline substitution, or might only perform inline substitutions to calls in the scope of an inline declaration
注意函数参数要指定void
。否则,编译器将决定参数的数量和类型是从函数调用中推导出来的。
What is the correct way to use inline here
static inline
和 inline static
都是允许的,它们的意思是一样的。 static inline
是首选,因为像 static
这样的“存储 class 说明符”总是应该在声明中排在第一位(参见 C11 §6.11.5)。
should I inline this function
要回答这个问题,您需要对您的程序进行两种方式的基准测试,并找出哪个更快。
目前它们在功能上是等价的,但是 static inline
是编写 C 的正确方法。这是因为 C17 已经使其他样式过时和不好的做法:
6.11.5 Storage-class specifier
The placement of a storage-class specifier other than at the beginning of the declaration specifiers in a declaration is an obsolescent feature.
static
是“存储 class 说明符”。
should I inline it?
内联只是对编译器的提示,如果对性能影响太大,编译器可以随意忽略它。
此外,对于本地定义的函数(在同一个 .c file/translation 单元中),编译器可以自由决定内联一个函数,即使它没有被标记为这样。
在大多数情况下,对于headers中未定义的static
函数,我认为最好不要指定inline
,让编译器在其认为合适的情况下内联函数, 根据您提供的优化选项 (-O<n>
, -Ofast
, -Osize
).