ios - inline 什么意思
PHPz
PHPz 2017-04-17 13:45:05
[iOS讨论组]

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

PHPz
PHPz

学习是最好的投资!

全部回复(3)
阿神

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没有任何作用。
天蓬老师

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

阿神

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号