其他分享
首页 > 其他分享> > 存储连续性

存储连续性

作者:互联网

  1. 自动存储连续性:块中的局部变量,程序进入块时被创建,离开块时被销毁。
  2. 静态存储连续性:static定义的变量和全局变量,程序运行期间都存在。
  3. 线性存储连续性:变量使用关键字thread_local声明时,其生命周期与所属线程一样长。
  4. 动态存储连续性:用new运算符分配的内存一直存在知道delete运算符将其释放活程序结束为止。
    作用域和链接
    作用域描述了名称的可见性,链接描述了名称如何再不同单元间共享。

c++函数的作用域可以时整个类或整个名称空间,包括全局,但不能是局部,不能再代码块里定义函数。

C++11中的register
在c中register表示请求用cpu寄存器来存储自动变量,可以提高访问速度。但在c++11中关键字register只是显式的指出变量式自动的,和c中的auto的用途一样,显示的表明局部变量和外部变量重名。

静态持续变量

  1. 外部连接性
  2. 内部链接性
  3. 无连接性
    如果没用显示的初始化静态变量,静态变量将默认初始化为0
int global; // 外部连接性的静态变量
static int local_global; // 内部链接的静态变量
int main()
{
}
void func()
{
  static int x=1;  // 无连接的静态变量
}

静态变量的初始化

除默认0初始化外,还可以对静态变量进行常量表达式初始化和动态初始化。
动态初始化:变量将在编译后初始化。
静态初始化:编译器处理文件时初始化

  1. 所有静态变量都被0初始化,不管是否有显示的初始化。
  2. 如果使用常量表达式初始化了变量,且编译器仅根据文件内容就可计算表达式,编译器将进行常量表达式初始化。必要时编译器进行简单计算
  3. 如果没用足够信息,变量将被动态初始化
#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