static和inline配合修饰函数

创建时间:2022/2/22 18:50
更新时间:2022/5/9 19:31
作者:gi51wa2j
标签:bingo, C, 细节知识

1. 预先了解的知识

1.1 static

static关键字用途太多,以致于让新手模糊。不过,总结起来就有两种作用,改变生命期和限制作用域。如:
         1.修饰inline函数:限制作用域static和inline配合修饰函数
         2.修饰普通函数:限制作用域
  用static修饰的函数,本限定在本源码文件中,不能被本源码文件以外的代码文件调用,隐藏的作用
         3.修饰局部变量:改变生命期
把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。  
共有两种变量存储在静态存储区:全局变量和 static 变量,存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。
拥有和全局变量的同一个特性:默认初始化为0;
         4.修饰全局变量:限制作用域
静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。 
static全局变量只初使化一次,防止在其他文件单元中被引用; 

1.2 inline

建议编译器对该函数进行内联,但是具体是否内联,需要看编译器
inline是c99的特性。在c99中,inline是向编译器建议,将被inline修饰的函数以内联的方式嵌入到调用这个函数的地方。而编译器会判断这样做是否合适,以此最终决定是否这么做。

https://www.cnblogs.com/chen-farsight/p/6027842.html

2.static与inline配合

举例:
在.h文件中发现这样一行代码
static inline void somefunction(void);


2.1 static inline的优劣


static inline的优劣

根据上面的定义可以知道,如果static inline关键字生效(因为只有编译器有最终决定权,我们只有建议权,这点在后面会细讲),static inline会以一种类似于宏定义的方式,将调用被static inline修饰的函数的语句替换为那个函数体对应的指令,但实际上只是inline的作用,static作用其实是维护代码的健壮性

好处:  减少调用函数时的开销,如: 减少传参时可能引起的压栈出栈的开销。 减少PC跳转时对流水线的破坏。 
坏处: * 代码所占体积会更大。

参考链接

https://zhuanlan.zhihu.com/p/132726037
https://www.cnblogs.com/we1238/articles/8890658.html
https://www.cnblogs.com/thrillerz/p/5208579.html