inline就和它字面意思一样,“将代码插入进去“。 加了inline的函数,我们期望编译器直接将代码插入到调用的地方,比如下面代码 static inline void hello_world(void) { printf("hello world\n"); } int main() { hello_world(); hello_world(); } 那么编译器会把这段代码看成 int main() { printf("hello world\n"); printf("hello world\n"); } 就和宏展开一样。因此省去了函数调用,加快了一点点运行速度。同时代码中有了两个printf("hello world\n"),增加了一点重复的代码,也就是所谓的 使用inline会增加二进制映像的大小。 但是inline不是绝对会有效果的,它更像一种建议,编译器会智能地处理inline,在可以展开的时候才会展开。 有几种情况下使用inline没有效果,其实都和inline本身展开的特点相关。 1.函数地址被引用 typedef void (*hello)(void); int main() { hello f=hello_world; f(); } 这种情况下,inline不会被展开,那么inline没有任何效果。 2. 函数是对外接口,考虑下面这种情况。 a.h ---- #ifndef __A_H__ #define __A_H__ inline void hello_world(void); #endif a.c ---- #include <stdio.h> inline void hello_world(void) { printf("hello world\n"); } main.c ---- #include "a.h" int main() { hello_world(); } 在这个例子中,程序编译时,是先把a.c编译成a.o,main.c编译成main.o,然后将a.o和main.o链接起来。 可想而知,在这个过程中,main.c根本没法将hello_world()展开。 其实这个情况和情况一是类似的,在这里,hello_world的地址被引用了。只不过这个地址是在链接时候才确定的。 这也是为什么inline函数都是static的。 3. 没有开启优化的情况下gcc默认不展开inline函数,简单的说就是不优化的情况下,inline没有任何作用。
inline就和它字面意思一样,“将代码插入进去“。
加了inline的函数,我们期望编译器直接将代码插入到调用的地方,比如下面代码
那么编译器会把这段代码看成
就和宏展开一样。因此省去了函数调用,加快了一点点运行速度。同时代码中有了两个printf("hello world\n"),增加了一点重复的代码,也就是所谓的 使用inline会增加二进制映像的大小。
但是inline不是绝对会有效果的,它更像一种建议,编译器会智能地处理inline,在可以展开的时候才会展开。
有几种情况下使用inline没有效果,其实都和inline本身展开的特点相关。