C++学习笔记3——存储持续性、作用域和链接性

1. 存储持续性

  • 自动存储持续性:在函数中定义或声明的变量存储持续性为自动的,它们在程序开始执行其所属的函数或代码块时被创建,在执行完函数或代码块时,使用的内存被释放;
  • 静态存储持续性:在函数定义外定义的变量和使用关键字static定义的变量存储持续性为静态,在程序整个运行过程中都存在
  • 动态存储持续性:用new运算符分配的内存,直到delete运算符释放或程序结束为止一直存在。

2. 作用域和链接

作用域描述文件在多大范围内可见。

  • 作用域为局部的变量只在定义它的代码块(花括号括起来的一系列语句,如函数体)中可用。
  • 作用域为全局(文件作用域)的变量在定义位置到文件结尾之间可用
  • 在类中声明的变量作用域为整个类,在名称空间中声明的变量作用域为整个名称空间。

C++函数的作用域可以是整个类或整个名称空间,但不能是局部的(因为不能在代码块中定义函数)

3. 不同存储方式

3.1 自动存储持续性变量

默认情况下,函数中声明的函数参数和变量的存储持续性为自动,作用域为局部,没有链接性,即只能在函数(代码块)内访问。
自动变量的数量随着函数的运行或结束而有所增减,因此函数需要栈对自动变量进行管理。

3.2 静态存储持续性变量

C++为静态存储持续性变量提供了三种链接性:

  • 外部链接性(可在其他文件中访问),创建需要在代码块外面声明
  • 内部链接性(只能在当前文件中访问),需要在代码块外面声明并使用static
  • 无链接性(只能在当前函数或代码块中访问),需要在代码块内声明并使用static

静态变量的数目在程序运行期间保持不变,编译器分配固定内存块存储所有静态变量,初始化为0,在程序执行期间一直存在。

3.2.1 外部链接性

变量只能有一次定义,使用引用声明extern引用已有的变量,不分配存储空间。如果要在多个文件中使用外部变量,只需在一个文件中包含该变量的定义,但在使用该变量的其他所有文件中使用extern关键字进行声明。

同名的局部变量会隐藏全局变量。
在变量前使用“::”运算符可用使用该变量的全局版本。

3.2.2 内部链接性

在代码块外部使用static限定符定义变量,该变量的链接性为内部,只能在当前文件中使用。

文件中的静态变量与另一个文件中的常规外部变量同名,静态变量会隐藏常规外部变量。如下代码展示了内部链接性与外部链接性。代码位于两个文件中,通过编译链接后运行。
main.cpp:

// main.cpp
#include <iostream>
int tom = 3;
int dick = 30;
static int harry = 300;void remote_access();int main()
{using namespace std;cout << "main() reports the following addresses:" << endl;cout << &tom << " = &tom, "<<&dick <<" = &dick, ";cout << &harry << " = &harry"<<endl;remote_access();return 0;
}

twofile.cpp:

#include <iostream>
extern int tom;
static int dick = 10;
int harry = 200;void remote_access()
{using namespace std;cout <<"remote_access() reports the following addresses:"<<endl;cout << &tom << " = &tom, "<<&dick <<" = &dick, ";cout << &harry << " = &harry"<<endl;
}

使用g++在linux下进行编译,生成可执行文件:

g++ main.cpp twofile.cpp -o main

运行结果如下:
在这里插入图片描述可见两个函数中使用了同样的tom变量,但使用了不同的dick变量和harry变量。

3.3.3 无链接性

在代码块中用static限定符定义变量,则变量没有链接性,只能在代码块中使用,但在该代码块不运行时依然存在,因此在两次调用函数之间变量的值保持不变。

如果初始化了静态局部变量,则只在启动时进行一次初始化,再次调用时不再会像自动变量一样进行初始化。

以下代码中展示了自动变量与静态局部变量。

#include <iostream>
const int ArSize = 10;void strcount(const char* str);int main()
{using namespace std;char input[ArSize];char next;cout <<"Enter a line"<<endl;cin.get(input, ArSize);while(cin){cin.get(next);while(next != '\n')cin.get(next);strcount(input);cout << "Enter next line (empty line to quit)"<<endl;cin.get(input, ArSize);}cout<<"Bye"<<endl;return 0;
}woid strcount(const char * str)
{using namespace std;static int total = 0;int count = 0;cout <<"\""<<str<<"\"contains";while(*str++)count ++;total += count;cout << count << " characters"<<endl;cout << total << " characters total"<<endl;
}

运行结果如下:
在这里插入图片描述可见count变量每次都变化,而total变量在原有的基础上累加。

3.4 限定符

  • volatile限定符

表示即使程序代码没有对内存单元进行修改,其值也可能发生变化。

编译器可能进行某种优化:假设编译器发现程序在几条语句中两次使用了某个变量的值,则编译器可能不是让程序查找这个变量两次,而是将这个值缓存到寄存器中。这种优化假设两次使用之间变量的值不会变化。如果不将变量声明为volatile,则编译器将进行这种优化,声明为volatile相当于禁用这种优化。

  • mutable限定符

可用用来指出,即使结构(或类)变量为const,其某个成员也可能被修改。
如下的例子:

struct data 
{char name[30];mutable int accesses;……
};
const data veep = {"Claybourne Clodde", 0, ……}strcpy(veep.name, "Joye Joux");// 不允许
veep.accesses++;//允许

veep结构被声明为const,禁止修改其成员;但声明为mutable的accesses成员可以被修改。

  • const限定符

const限定符定义的全局变量具有内部链接性,因此可以包含在头文件中。被多个文件包含也不会产生冲突。

3.5 使用new分配的内存

使用new分配的动态内存不受作用域与链接性规则控制,其值取决于使用new和delete的位置。虽然存储方案概念不适用于动态内存,但适用于用来跟踪动态内存的自动和静态变量指针变量。
如下面的例子:

float * p_fees = new float[20];

由new分配的80个字节(假设float为4个字节)的内存将一直保留在内存中,直到使用delete进行释放。但当包含该声明的代码块运行完毕后,p_fees指针将消失。如果还需要使用这80个字节的内容,则需要将其地址传递或者返回。如果将p_fees声明为外部链接,则在代码块外部也可以使用该指针。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/460990.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ios Framework版本号的问题。

自己创建的framework和普通的app的版本号设置的地方是有所有不同的。 framework 的版本号是在 TARGETS -> Build Settings -> current Project Version 这个地方设置的&#xff0c; 在创建framework的时候xcode 会自动创建一个framework.h的文件名&#xff0c;framewo…

Linux 开机自动挂载硬盘

在日常使用 Linux 系统的过程中&#xff0c;我们可能需要挂载一些机械硬盘或者移动硬盘来存储数据。手动挂载虽然简单&#xff0c;但每次重启后都需要重新操作&#xff0c;未免有些繁琐。那么&#xff0c;如何让硬盘在开机时自动挂载呢&#xff1f;本篇博客将详细介绍如何通过配…

SSRF-pikachu

系列目录 第一章 暴力破解 第二章 Cross-Site Scripting-pikachu 第三章 CSRF 第四章 sql-injection 第五章 RCE 第六章 File inclusion 第七章 Unsafe filedownload 第八章 Unsafe fileupload 第九章 Over Permission 第十章 ../../ 第十一章 敏感信息泄露 第十二…

配电柜弧光保护装置的应用与功能

随着配电系统复杂度的提升&#xff0c;电弧故障可能带来的高温与巨大电磁冲击对系统及人员的安全构成了威胁。弧光保护装置因其快速识别和切断故障的能力&#xff0c;成为现代配电系统中不可或缺的一部分。本文将结合ARB5系列弧光保护装置的设计&#xff0c;对弧光保护的工作原…

12-Docker发布微服务

12-Docker发布微服务 Docker发布微服务 搭建SpringBoot项目 新建一个SpringBoot项目 选择依赖项Spring Web和Spring Boot Actuator 在com.qi.docker_boot下创建controller目录&#xff0c;并在该目录下创建OrderController的java类 OrderControllerjava类的内容如下&#xf…

ETL集成工具丨如何运用ETLCloud单步调试断点功能

在现代数据处理领域&#xff0c;ETLCloud 的单步调试断点功能正成为数据管理的重要工具。ETLCloud 是一个强大的云端数据处理平台&#xff0c;它提供了灵活的单步调试功能&#xff0c;使得用户能够逐步跟踪和分析数据处理流程。本文将探讨如何运用 ETLCloud 的单步调试断点功能…

基于LORA的一主多从监测系统_主从节点交互

上一步我们完成了子节点与PC交互&#xff0c;下面我们使用主节点和从节点进行交互&#xff0c;目前是一个主节点、单个从节点&#xff0c;相当于是一对一传输&#xff0c;主要的思路如下&#xff1a; ------>主节点发送问询帧 ------>延时等待子节点回复 ------>子…

PPT制作新选择:本地部署PPTist结合内网穿透实现实时协作和远程使用

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站】 前…

【GO学习笔记 go基础】编译器下载安装+Go设置代理加速+项目调试+基础语法+go.mod项目配置+接口(interface)

编译器下载&安装 下载并安装go1.23.2.windows-amd64.msi默认安装再C:\Program Files\Go\ PS C:\Users\kingchuxing\Documents> go version go version go1.23.2 windows/amd64Go设置GOPROXY国内加速 windows // 启用 Go Modules 功能 PS C:\Users\kingchuxing…

appium+mumu模拟器+python 嚼碎菜鸟教程

1、android sdk 下载安装 下载地址&#xff1a;https://www.androiddevtools.cn/index.html# 选择版本&#xff1a;android sdk【sdk tools:installer_r24.4.1-windows.exe】 参考步骤&#xff1a;https://blog.csdn.net/2401_83004375/article/details/139300339 2、jdk 安装…

关于我的数据库——MySQL——第二篇

&#xff08;叠甲&#xff1a;如有侵权请联系&#xff0c;内容都是自己学习的总结&#xff0c;一定不全面&#xff0c;仅当互相交流&#xff08;轻点骂&#xff09;我也只是站在巨人肩膀上的一个小卡拉米&#xff0c;已老实&#xff0c;求放过&#xff09;。 表的操作 创建表…

Python飞舞蝙蝠

目录 系列文章 写在前面 完整代码 代码分析 写在后面 系列文章 序号直达链接爱心系列1Python制作一个无法拒绝的表白界面2Python满屏飘字表白代码3Python无限弹窗满屏表白代码4Python李峋同款可写字版跳动的爱心5Python流星雨代码6Python漂浮爱心代码7Python爱心光波代码…

Canvas简历编辑器-选中绘制与拖拽多选交互设计

Canvas简历编辑器-选中绘制与拖拽多选交互设计 在之前我们聊了聊如何基于Canvas与基本事件组合实现了轻量级DOM&#xff0c;并且在此基础上实现了如何进行管理事件以及多层级渲染的能力设计。那么此时我们就依然在轻量级DOM的基础上&#xff0c;关注于实现选中绘制与拖拽多选交…

基于Multisim的四位抢答器设计与仿真

四位选手进行抢答比赛&#xff0c;用基本门电路及集成逻辑器件构成四人抢答器。选手编号分别为1&#xff0c;2&#xff0c;3&#xff0c;4号&#xff0c;用S1&#xff0c;S2&#xff0c;S3&#xff0c;S4四个按钮作为抢答按钮&#xff0c;S0按钮为总清零按钮。当四人中任何一个…

20241031使用Rockchip原厂RK3566的Buildroot编译RK3399方案

20241031使用Rockchip原厂RK3566的Buildroot编译RK3399方案 2024/10/31 18:06 RK3566_Linux5.10_V1.2.0_20241022.tar.gz rk356x_linux5p10_v120_20241025_1020.tgz 由于Rockchip可能像全志一样&#xff0c;为了简单&#xff0c;直接所有的SDK都打包/放置在一个git仓库里了&…

算法定制LiteAIServer视频智能分析软件的过亮、过暗及抖动检测应用场景

在现代社会中&#xff0c;视频监控系统扮演着举足轻重的角色&#xff0c;其视频质量直接关乎监控系统的可靠性与有效性。算法定制LiteAIServer通过引入抖动检测和过亮过暗检测功能&#xff0c;为视频监控系统的稳定性和用户体验带来了显著提升。 以下是对这两种功能的技术实现、…

OpenCV 学习笔记

OpenCV 环境安装 pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple 显示窗口 cv2.namedWindow 是 OpenCV 库中的一个函数&#xff0c;用于创建一个命名窗口&#xff0c;以便在该窗口中显示图像或进行其他图形操作。这个函数在处理图像和视频时非常…

超越 YOLOv8,MAF-YOLO利用重参化异构卷积大幅度提升多尺度信息融合能力!

由于多尺度特征融合的有效性能&#xff0c;路径聚合FPN&#xff08;PAFPN&#xff09;被广泛应用于YOLO检测器中。 然而&#xff0c;它不能同时高效且自适应地融合高级语义信息与低级空间信息。本文提出了一种名为MAF-YOLO的新模型&#xff0c;这是一个具有多功能 Neck 网络的新…

堆(堆排序,TOP K, 优先级队列)

1 概念解释 堆的定义&#xff1a;堆是一颗完全二叉树&#xff0c;分为大堆和小堆 大堆&#xff1a;一棵树中&#xff0c;任何父亲节点都大于等于孩子的节点&#xff0c;大堆的根结点最大 小堆&#xff1a;一棵树中&#xff0c;任何父亲节点都小于等于孩子节点&#xff0c;小堆…

练习LabVIEW第二十八题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第二十八题&#xff1a; 建立一个VI&#xff0c;模拟滚动—个骰子(骰子取值1~6)&#xff0c;跟踪骰子滚动后的取值出现次数…