存储连续性
作者:互联网
- 自动存储连续性:块中的局部变量,程序进入块时被创建,离开块时被销毁。
- 静态存储连续性:static定义的变量和全局变量,程序运行期间都存在。
- 线性存储连续性:变量使用关键字thread_local声明时,其生命周期与所属线程一样长。
- 动态存储连续性:用new运算符分配的内存一直存在知道delete运算符将其释放活程序结束为止。
作用域和链接
作用域描述了名称的可见性,链接描述了名称如何再不同单元间共享。
c++函数的作用域可以时整个类或整个名称空间,包括全局,但不能是局部,不能再代码块里定义函数。
C++11中的register
在c中register表示请求用cpu寄存器来存储自动变量,可以提高访问速度。但在c++11中关键字register只是显式的指出变量式自动的,和c中的auto的用途一样,显示的表明局部变量和外部变量重名。
静态持续变量
- 外部连接性
- 内部链接性
- 无连接性
如果没用显示的初始化静态变量,静态变量将默认初始化为0
int global; // 外部连接性的静态变量
static int local_global; // 内部链接的静态变量
int main()
{
}
void func()
{
static int x=1; // 无连接的静态变量
}
静态变量的初始化
除默认0初始化外,还可以对静态变量进行常量表达式初始化和动态初始化。
动态初始化:变量将在编译后初始化。
静态初始化:编译器处理文件时初始化
- 所有静态变量都被0初始化,不管是否有显示的初始化。
- 如果使用常量表达式初始化了变量,且编译器仅根据文件内容就可计算表达式,编译器将进行常量表达式初始化。必要时编译器进行简单计算
- 如果没用足够信息,变量将被动态初始化
#include<cmath>
int x; // 0初始化
int y=5; // 常量表达式初始化
long z = 13*13; // 常量表达式初始化,编译器计算了13*13
const double pi = 4.0 * atan(1); // 动态初始化,要初始化pi要调用atan,需要等到该函数被链接且程序执行时。
int enough = 2 * sizeof(long) + 1; // 常量表达式初始化
静态持续性、外部连接性
具有外部链接性的变量通常称为外部变量。也叫全局变量。
单定义规则
使用外部变量 的文件都必须声明它。c++提供了两种变量声明,定义式声明给变量分配存储空间,引用式声明使用extern关键字引用已有的变量,不可以进行初始化,否则为定义,导致分配存储空间。
double up; // 定义式声明,0初始化
extern int blem; // 引用式声明
extern char g = 'z'; // 虽然使用了extern但是进行了初始化,所以是定义式声明
如果局部变量与全局变量同名,全局变量将被隐藏,需要使用作用域解析运算符::,表示要使用全局变量。
// support.cpp
#include<iostream>
using namespace std;
extern int x; // 引用声明
void update(int n)
{
x+=n;
}
void local()
{
int x = -1; // 同名局部变量
cout<<"local x = "<<x<<endl;
x-=10;
cout<<"local x = "<<x<<endl;
cout<<"global x = "<<::x<<endl;
}
// external.cpp
#include<iostream>
using namespace std;
int x = 10; // 全局变量
void update(int n);
void local();
int main()
{
cout<<"global x = "<<x<<endl;
update(3); // 修改全局变量的值 +n
cout<<"global x = "<<x<<endl;
local(); // 定义了一个和全局变量同名的局部变量
cout<<"global x = "<<x<<endl;
return 0;
}
静态持续性、内部链接
使用static关键字修饰作用域为文件的变量,该变量只能在当前文件中访问。
// sup.cpp
#include<iostream>
using namespace std;
static int x = 20;
void func()
{
cout<<"other file"<<endl;
cout<<"x = "<<x<<endl;
x+=10;
cout<<"x = "<<x<<endl;
}
// external.cpp
#include<iostream>
using namespace std;
int x = 10; // 全局变量
void func(); // 在另外一个文件中定义,使用了一个内部链接的也叫x的静态变量
int main()
{
cout<<"global x = "<<x<<endl;
func();
cout<<"global x = "<<x<<endl;
return 0;
}
函数链接性
因为不允许在一个函数中定义另一个函数,所以所有的函数都是静态存储连续的,默认情况为外连接的。使用另外一个文件中的函数可以使用extern关键字在函数原型中(可选)。要想使用其他文件中的函数,该文必须作为程序的组成部分进行编译或由链接程序搜索库文件。
可以使用static关键字将函数的链接性设置为内部的。
单定义规则同样适用非内联函数,只能由一个定义,使用其他文件的函数必须包含其函数原型。
内联函数在头文件中。
语言链接性
链接程序要求每个不同函数都有不同的符号名。在c中一个名称对应一个函数,c++因为可以重载函数,所以对函数名翻译不同符号名称时进行了修正,如函数add,在c里可能符号名为_add, 而c++里可能叫_add_i 、 _add_d。
当c++程序要使用c语言中的函数时可以用函数原型指定要连接的函数
extern "C" int add(int, int); // 用c
extern "C++" int add(int, int); // 用c++
extern int add(int, int); // 默认c++
标签:连续性,存储,变量,初始化,int,静态,链接,函数 来源: https://www.cnblogs.com/baiyutang7/p/16385441.html