首页 > inline 什么意思

inline 什么意思

在看别人的库中发现有static inline 这样的写法,请问作用是什么.


http://blog.chinaunix.net/uid-26285146-id-3225668.html


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没有任何作用。

内联函数,提高函数的执行效率。

【热门文章】
【热门文章】