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的。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。