1. 预先了解的知识
1.1 static
static关键字用途太多,以致于让新手模糊。不过,总结起来就有两种作用,改变生命期和限制作用域。如:
2.修饰普通函数:限制作用域
用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用,隐藏的作用
3.修饰局部变量:改变生命期
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。
共有两种变量存储在静态存储区:全局变量和 static 变量,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
拥有和全局变量的同一个特性:默认初始化为0;
4.修饰全局变量:限制作用域
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。
static全局变量只初使化一次,防止在其他文件单元中被引用;
1.2 inline
建议编译器对该函数进行内联,但是具体是否内联,需要看编译器
inline是c99的特性。在c99中,inline是向编译器建议,将被inline修饰的函数以内联的方式嵌入到调用这个函数的地方。而编译器会判断这样做是否合适,以此最终决定是否这么做。
2.static与inline配合
举例:
在.h文件中发现这样一行代码
static inline void somefunction(void);
2.1 static inline的优劣
static inline的优劣
根据上面的定义可以知道,如果static inline关键字生效(因为只有编译器有最终决定权,我们只有建议权,这点在后面会细讲),static inline会以一种类似于宏定义的方式,将调用被static inline修饰的函数的语句替换为那个函数体对应的指令,但实际上只是inline的作用,static作用其实是维护代码的健壮性,
好处: 减少调用函数时的开销,如: 减少传参时可能引起的压栈出栈的开销。 减少PC跳转时对流水线的破坏。
坏处: * 代码所占体积会更大。
参考链接