static inline 延伸
2020-04-21 本文已影响0人
哦小小树
此内容分为两个知识点:
0x01 static
字面意思为静态,一直在那里
修饰变量
main函数之前初始化,并且占用一块常量区的内存空间。
这块存储空间在程序运行过程中都不会被释放。一直在那里
用途:
当我们需要保存一个变量,这个变量一直存在,并且在程序运行过程中始终存在
修饰函数
- 修饰的函数不能被外部文件引用
// A.h文件
// 文件声明
static void testStaticAction(); # 即便声明了静态函数,外部也无法调用
// 普通函数声明
void testActionWithoutStatic();
// A.m
// 静态函数
static void testStaticAction(){
NSLog(@"这是一个测试文件");
}
//普通函数实现
void testActionWithoutStatic() {
NSLog(@"没有static的函数");
}
// B.m中调用
// 报错,提示_ testStaticAction 找不到;只能A文件内部自己调用
testStaticAction();
// 正常
testActionWithoutStatic();
- 其他文件中可以定义相同名字的函数不会冲突
// B.m
static void testStaticAction() {
NSLog(@"%s",__func__);
}
// B.m 调用
// 打印的上面函数定义,而不是A.m中定义的函数
testStaticAction();
0x02 inline
inline修饰的函数为内联函数;目的是为了解决程序中函数调用效率的问题。
调用效率问题出在哪?
调用函数实际上是将程序执行顺序转移到函数所存在的内存中的某个地址。将函数的内容执行完毕后,再返回到转去执行该函数前的地方。
这种转移操作要求在转去前保护现场并标记已执行的地址,转回后先要恢复现场,并按原来保存的地址继续执行。因此调用函数是有一定的时间和空间方面的开销。
结论:
针对一些函数体代码不是很大,但又频繁调用的函数来讲,解决其效率问题更为重要。而内联函数的引用就是为了解决这一问题。
0x03 static inline func
集合了了static和inline的特性,是个内联函数,同时保证这个内联函数只在当前文件中可用。
意义:
不会污染命名空间,同样的内联函数名,可以再其他文件中声明。
注意:
static inline应用的场景主要是C/C++。Objective-C中的方法是无法使用static进行声明的。