1、作用域
块作用域:用{}阔起来的,从声明开始到“}” 结束
函数作用域:goto(标识符) 的作用域为整个函数。
函数原型作用域:函数声明开始,函数声明结束而结束
文件作用域:整个文件或者程序
2、链接
无链接:即只在其作用域内可见
内链接:即在从声明到文件结束都是可见的
外链接 :多个文件或者整个程序都可见
3、存储期
静态存储期:在整个程序都是占有内存的
线程存储期:thread_local,其声明后会给每个线程分配一个单独的私有备份
自动存储期:局部变量通常都自动为auto 存储期
动态存储期:就是用new 或者malloc分配的内存,如果不主动释放,在整个程序都占有内存
4、总结
存储类别 存储期 作用域 链接属性 表示
自动 自动 块 无链接 块内声明变量
寄存器 自动 块 无链接 块内使用register修饰
静态外链接 静态 文件 外链接 所有函数外
静态内链接 静态 文件 内链接 所有函数外,用static修饰
静态无链接 静态 块 无链接 块内,使用static修饰
线程存储 自动 线程 无链接 thread_local修饰
4、函数的存储期
外部函数:默认都是外部函数
静态函数:使用static 修饰,内连接
内联函数:inline
5、注意
- auto 在c中表示自动存储期
- 但是auto在c++11 中表示自动推断类型
- register 声明后,并不一定会存到寄存器中,他只是一种请求。及时不存在寄存器中也不能对其取地址。同时可以存为register的类型可不多,
因为有些类型太大了,寄存器存不下。
- 静态变量或者全局常量,都存储在静态区,在程序载入时已经执行赋值了 ,他们如果不被初始化,将会被初始化为0,存在bss段中。
6、申请内存
malloc:malloc(sizeof(xxx))
calloc:calloc(num,sizeof(xx))
realloc: realloc(p,size)
7、限定符
volatile
const:
restrict: