C++:储存持续性、作用域及链接性
C++11的存储类别会影响信息在文件间的共享,一共有四种方案来保存数据,也就是变量的保护时间,而作用域决定变量的保存范围。
持续时间
- 自动存储连续性:函数内部定义中声明的变量,函数执行时被创建内存空间保存变量,函数执行完毕后空间释放,因此作用域为局部的。
- 静态存储连续性:函数外部定义的变量,存在整个代码的生命周期,比如全局变量,static(局部变量)。
- 线程存储连续性:用于多核CPU的多线程编程,如果是thread_local,则存在代码整个声明周期,暂时不考虑并行编程。
- 动态存储连续性:new的内存空间就是动态,动态内存空间管理开发者自行把控,作用域为开辟变量的内存空间是局部还是全局。
作用域
局部变量:函数内部的变量,只能在同级{}及子集{}中使用。
全局变量:全局文件都可以extern声明后调用,可在所有函数中使用。
C++的函数只能是整个class类或整个命名空间,但不能是局部的。
链接性
链接性为外部的名称(extern)可以在文件间共享,链接性为内部的名称只能在文件内部共享。自动变量(函数内部)的名称没有链接性。
#include <iostream>
using namespace std;
void oil(int x);
int a = 10;//静态储存,全局变量,外部链接性(extern)
static int harry=10;//静态储存,全局变量,内部链接性
int main(void)
{
int tex = 31;//自动储存,局部变量,无链接性
int year = 2022;//自动储存,局部变量,无链接性
cout << tex << " " << &tex << endl;
cout << year << " " << &year << endl;
oil(tex);
return 0;
}
void oil(int x/*局部变量,自动储存*/)
{
cout << "in oil(x) :" << x << " " << &x << endl;//只在最近的{}内有效
{//tex只在最近的{}内有效
int tex = 31;
cout << "in oil(tex) :" << tex << " " << &tex << endl; //局部变量, 自动储存,,无链接性
cout << "in oil(x) :" << x << " " << &x << endl;
}
}
因此若在函数内与函数外定义了同名的变量,编程时需要特别,产生上述错误编译器会帮助你检查,但是前提是我们规范使用const、static、extern,这样编译器报错第一时间自己就知道哪里出错了。全局变量建议使用结构体进行统一管理,便于对部分变量进行const或者mutable。
本文来自博客园,作者:{张一默},转载请注明原文链接:https://www.cnblogs.com/YiMo9929/p/16721298.html