扫码关注官方订阅号
在看别人的库中发现有static inline 这样的写法,请问作用是什么.
学习是最好的投资!
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
内联函数,提高函数的执行效率。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
inline就和它字面意思一样,“将代码插入进去“。
加了inline的函数,我们期望编译器直接将代码插入到调用的地方,比如下面代码
那么编译器会把这段代码看成
就和宏展开一样。因此省去了函数调用,加快了一点点运行速度。同时代码中有了两个printf("hello world\n"),增加了一点重复的代码,也就是所谓的 使用inline会增加二进制映像的大小。
但是inline不是绝对会有效果的,它更像一种建议,编译器会智能地处理inline,在可以展开的时候才会展开。
有几种情况下使用inline没有效果,其实都和inline本身展开的特点相关。
http://blog.chinaunix.net/uid-26285146-id-3225668.html
内联函数,提高函数的执行效率。