开发者社区> 问答> 正文

inline 什么意思

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

展开
收起
a123456678 2016-07-28 10:02:24 2498 0
1 条回答
写回答
取消 提交回答
  • 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的。

    1. 没有开启优化的情况下gcc默认不展开inline函数,简单的说就是不优化的情况下,inline没有任何作用
    2019-07-17 20:01:02
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载