弱弱的问一下 static inline 有什么作用?
1.
uboot的arch\arm\include\asm\arch下的s3c2400.h中:
static inline struct s3c24x0_clock_power *s3c24x0_get_base_clock_power(void)
{
return (struct s3c24x0_clock_power *)S3C24X0_CLOCK_POWER_BASE;
}
......
中的 static inline 有什么作用呢?
2.
在.h 文件中定义了 static inline 函数 , 当.c 文件包含(#include)这个 .h 文件后, 在.h 文件中定义的static inline 函数 也就相当于在 .c 中定义的static inline 函数, 因为.h已经被.c 文件包含了
那uboot的arch\arm\cpu\arm920t\s3c24x0下的speed.c 中
#include <common.h>
#ifdef CONFIG_S3C24X0
#include <asm/io.h>
#include <asm/arch/s3c24x0_cpu.h>
#define MPLL 0
#define UPLL 1
哪一个是包含 arch\arm\include\asm\arch 下的 s3c2400.h 中 static inline 的头文件呢? 还是其它的原因呢??
3.
static inline 是静态的:因为这些函数其实统一接口,大家都需要实现这个接口,如果不用static,那就很有可能重名。编译就会出错了。 这里的接口 指什么呢?? 可以截图看么??
static inline 是内联的:小函数,而是调用的很频繁,用内联会提升很多效率! 那在1. 中可以不指定 XX是内联函数么 ??
本人小白,若有用词不当的地方还请指正,高手勿喷。谢谢!!
------解决思路----------------------
两个关键字,分开来理解
static:静态函数,这也是最基本的语法。包含到不到的源文件中时,每个源文件中相当有一份独立的 static 函数。可以说是说来防重名的,但也不只是这个功能。
inline:内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义。可以提高编译效率!
------解决思路----------------------
static 用于修饰函数的时候,意思是此函数只能在此文件中使用,所以static inline 病不冲突,按字母理解就行了
------解决思路----------------------
如果编译器能正确inline函数的话,static就是多余的,但是如果编译器忽略inline前缀的话,static就是必须的。在vc里面还有个特殊的关键字 __forceinline,在vc上用他就不需要static了
------解决思路----------------------
static 表示函数只在本文件被调用
inline是内联函数,编译的时候会在调用该函数的地方将函数展开,优点是程序运行时省去了函数调用耗费的时间,缺点是占用了空间。
------解决思路----------------------
static 本文调用 防止和外部的函数名字等冲突 隔离作用
inline 预编译会运算 减少最后编译的代码量 减小汇编行数
------解决思路----------------------
头文件里定义的函数,如果不加inline,就会报冲突.inline的意思是函数体在调用的地方直接展开,有点类似宏的意思.但实际上inline只是给编译器一个建议,具体采用不采用编译器自己说了算.使用inline的最实际的好处就是可以在.h文件中定义函数体而不会报冲突.
static较少见在.h里面使用,一般都是在.cpp文件里面使用,表示这个函数名或者变量名只有在这个文件范围内才有效.