当前位置: 首页 > news >正文

C++内存模型

1.存储持续性:描述数据在内存中的保留时间

自动存储持续性:

静态存储持续性:

动态存储持续性:

2.作用域:描述名称在翻译单元(文件)的可见范围

声明区域 declaration region:可以在其中进行声明的区域。

潜在作用域 potential scope:从声明点开始,到其声明区域的结尾。变量对程序而言可见的范围被称为作用域scope。

3.链接性:描述名称如何在不同翻译单元(文件)间共享。有3种值:文件外部,文件内部,无。

4..自动存储持续性变量:在函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性

可以使用关键字auto来显示指出存储类别,它极少被使用,比如它可以表明程序中特意创建了一个自动变量,它将暂时覆盖全局定义。

寄存器变量是另一种形式的自动变量。使用关键字register提醒编译器,用户希望它通过cpu寄存器,而不是堆栈来处理特定的变量,从而提供对变量的快速访问。

如果变量被存储中寄存器中,则没有内存地址,不能将地址操作符用于寄存器变量。

在编写for循环时,编译器可能自动使用寄存器来存储循环计数。

5.静态存储持续性变量

由于静态变量的数目在运行期间是不变的,程序不需要使用特殊装置如堆栈来管理它们,将分配固定的内存块来所有静态变量。

默认情况下,静态数组和结构每个元素或成员的所有位都设置为0。

只能使用常量表达式来初始化静态变量,常量表达式包括:字面值常量,const常量,enum常量,sizeof操作符。

传统的K&R C不允许初始化自动数组和结构,但允许初始化静态数组和结构

在代码块外声明的变量链接性为外部;

在代码块外声明的static变量链接性为内部;

在代码块内声明的static变量没有链接性;

5.1.外部链接性变量,在函数外部定义,也称为全局变量,链接性为外部,持续性为静态,作用域为其所属的文件内外。

自动变量将隐藏同名的外部变量。

只能有一个文件中定义声明某个外部变量,其它文件中可以使用extern来引用声明其它文件中定义声明过的外部变量;在同一个文件中extern是可选的;不能在引用声明中初始化变量,初始化指的是在分配内存单元时给它赋值。

例如:extern double warming;

在c++中,使用作用域操作解析符(::)来显示指出操作的是全局变量。

5.2.内部链接性变量,若要常规外部变量前加了static限定符,则其变成内部变量,链接性为内部,持续性为静态,作用域为文件内。

内部变量将隐藏同名的外部变量。

c++标准指出:使用static来创建内部链接性的方法将逐步被淘汰,提供了另一种由名称空间来使用共享数据的方法。

const全局变量链接性为内部的

内部链接性还意味着,每个文件都有自己的一组常量,这就是能够将常量定义放在头文件中的原因。

如果希望const全局变量链接性为外部,可以再加上extern关键字。如extern const int state=1;这与常规的定义声明不同多加了使用了extern,其它引用声明形式不变。

5.3.无链接性静态变量,作用域在代码块中的静态持续性变量,使用static限定符。

6.cv-限定符(cv-qualifier),cv表示const和volatile(不稳定的)

volatile表明即使程序没有对内存单元修改,其值 也可能发生变化。

mutable表明即使变量声明为const,其值也可以被修改。较少使用。

7.函数的存储持续性都是静态的,链接性为外部,即可以在文件间共享。

可以在函数原型中用extern指出函数是在另一个文件中定义的,这是可选的。

可以使用static将函数的链接性设置为内部的,要同时在函数原型和定义前使用static。

单定义规则:对于非内联函数,程序中只能包含一个定义。同一个内联函数名的内联定义必须相同。

8.语言链接性:language linking。

在c语言中,一个名称只对应一个函数,这是c语言链接性。

在c++中,有同名函数的不同重载版本,c++编译器执行名称修饰,将这些重载函数翻译成不同的符号名称,这是c++语言链接性。

链接程序寻找函数时,c++函数和c函数有不同的方式。可能c仅根据函数名,而c++要根据函数名和参数名。为解决这个问题,在函数原型前加上extern “C”,或extern “C++”

,来指出要使用的约定。例如 extern void spoff(int); 这样默认使用的是c++语言链接约定。

9.动态内存由操作符new和delete控制,不是由作用域和链接性控件。

虽然存储方案并不适用于动态内存,但适用于用来跟踪动态内存的自动静态指针变量。

使用new语句设置静态存储变量的代码必须在函数中,因为只能使用常量表达式来初始化静态存储变量。

在程序结束时,由new分配的内存通常都将被释放,但在不很健壮的操作系统中,请求的大型内存块时可能不会被自动释放,最佳的做法时使用delete释放。

10.布局new操作符

11.名称空间 namespace

名称空间可以嵌套,但不能位于代码块中,默认情况下,名称空间中声明的变量是外部链接性的,除非它引用了常量。

全局名称空间:它对应于文件级声明区域。

通过作用域 解析操作符::使用名称空间限定名称。名称空间结尾的大括号后面无分号

内存的分配方式:

一、从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量。
二、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
三、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。

http://www.jsqmd.com/news/785591/

相关文章:

  • 清洁度分析仪究竟哪家靠谱?2026 AI液冷清洁度分析仪选型避坑指南 - 工业干货社
  • CANN模型推理并行策略分析
  • 前后端分离作业管理系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 基于Swin-UNETR的AI冠状动脉钙化自动评分系统开发与临床验证
  • 2026交调系统哪家好?广州聚杰芯科交调系统,质量好、信得过 - 品牌速递
  • 成都螺纹钢代理商|专注西南建筑钢材一站式批发|获取盛世钢联免费钢筋报价 - 四川盛世钢联营销中心
  • 设计模式的原则和策略
  • 厂家直供更划算!2026广州聚杰芯科交通流量调查系统,品质靠谱售后有保障 - 品牌速递
  • 生成式AI开发中的法律风险:从数据爬取到模型部署的合规指南
  • 第 9 章:泛型、Trait 与宏
  • KNN模型准确率低?数据标准化与中心化是关键
  • AtCoder Beginner Contest 457 ABCDE 题目解析
  • 坑道钻机核心技术解析与2025年优质厂家选购全攻略 - 品牌策略师
  • 基于Claude AI与MCP的智能体架构:自动化竞争情报分析实战
  • CANN/community安全设计指南
  • 老药丸闲置别乱处理,北京记录者商行专业上门回收,合规安心变现 - 品牌排行榜单
  • DriverStore Explorer完全指南:免费清理Windows驱动存储区,让电脑运行更流畅
  • CANN/cannbot-skills Ops EasyASC DSL 仓库地图
  • 成都螺纹钢经销商|专注西南建筑钢材一站式批发|获取盛世钢联免费钢筋报价 - 四川盛世钢联营销中心
  • NLP技术量化组织民主氛围:从文本数据到决策过程分析
  • 从‘28’到‘00’:手把手调试蓝桥杯按键扫描程序,避开长按短按的那些坑
  • 建造者模式,生成器模式
  • 第 6 章:集合与迭代
  • 质量好到出圈!2026广州聚杰芯科交调设备,监测精度远超行业标准 - 品牌速递
  • CANN驱动获取Flash信息API
  • CANN/ops-math 对角线张量算子
  • SD-WebUI-Inpaint-Anything:智能图像修复的终极指南
  • 集成机器学习在濒危语言文本分类中的应用:以霍拉米语为例
  • AI赋能边缘计算安全:从威胁检测到隐私保护的实战指南
  • AI 正在重塑泳装行业?今年春夏爆款早已换了玩法