ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

存储连续性

2022-06-17 13:33:57  阅读:116  来源: 互联网

标签:连续性 存储 变量 初始化 int 静态 链接 函数


  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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有