GCC 对 C 语言的扩展
1. 内联函数
内联函数是一种特殊的函数,编译器会将内联函数的整个代码复制到调用该函数的位置,而不是将函数存储在外部,调用时再跳转过去执行。这样做可以节省函数调用的开销,并且由于编译器可以一起优化调用者和被调用者,因此在调用点可能会进行潜在的优化。不过,如果将函数复制到每个调用它的代码块中,可能会对代码大小产生不利影响。所以,只有当函数小而简单,或者在不同地方调用次数不多时,才应该使用内联函数。
1.1 内联关键字
多年来,GCC 支持 inline
关键字,用于指示编译器将给定的函数内联。C99 对这个关键字进行了规范化:
static inline int foo (void) { /* ... */ }
不过,从技术上讲,这个关键字只是一个提示,建议编译器考虑将给定的函数内联。GCC 还提供了一个扩展,用于指示编译器始终内联指定的函数:
static inline __attribute__ ((always_inline)) int foo (void) { /* ... */ }
1.2 替代预处理器宏
内联函数的一个明显候选是预处理器宏。GCC 中的内联函数性能与宏相当,而且还能进行类型检查。例如,将下面的宏:
#define max(a,b) ({ a > b ? a : b; })
</