引用

  • static
  • inline
    这俩在C语言中也出现过所以不陌生。

前言

勿忘模板,二刷常态~~哈哈哈

static 通常用作声明静态变量
static type name例如:static int a;
static变量如果没有指定初始化,那么会自动初始化为0,且只能初始化一次。
而且静态变量即使离开作用域也不会立刻销毁,说明不是存在于栈区的数据。

inline 将函数以内联的方式嵌入到调用的函数。
inline int Add(int a,int b){ return a+b; }
内联函数会建议编译器把这个函数处理成内敛代码以提升性能,但是否采用看编译器决定。


正文

static

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using std::cout;
using std::endl;

void hhh(){
static int a = 1000;
a++;
cout << a << endl;
}

int main(){

hhh();
hhh();
hhh();
hhh();

return 0;
}

多次调用后发现static的值是累积的,说明函数结束后static的确没有被释放

但是作用域还是在那块函数内,就是说离开那个函数无法对变量进行操作。除非生成一个全局的静态变量,也就是将其放在main函数头上。


inline

1
2
3
4
5
6
7
8
int add(int a,int b){
return a + b;
}
int main(){
int x = add(1,2);

return 0;
}

正常情况下调用add函数的汇编无非就是两个参数压入栈,然后call到函数地址,运行完后add esp,8恢复栈平衡。
但是如果是内联函数,编译器就有可能进行优化:

1
2
3
4
5
6
7
8
inline int add(int a,int b){
return a + b;
}
int main(){
int x = add(1,2); //有可能就直接被优化成 int x = 1+2;

return 0;
}

但需要注意是有可能,现代编译器的智能化更明显,编译选项本身就有优化选项,所以不能百分之百确定会怎么被优化。
当然inline优化一般也是针对函数体比较简单的情况下,复杂的时候雀食不好优化得交给编译器处理。

反汇编的时候,debug可能还是保留过程,release大概会优化


结语

inline在后面就越来越少了,static还有其他用武之处放后面用到再说。
当然操作肯定不会局限于一个源文件下编译的时候,当这俩存在头文件中或者其他源文件又会怎么调用。