cpp primer plus笔记07-内存模型和命名空间

  1. 对于相同变量名的变量,CPP会覆盖作用域大的变量,而使用作用域小的变量,如果想在函数体内使用全局的变量可以在变量名前加上::加以区分,比如warm=3会使得局部的warm变量等于3,而::warm=3会使得全局的warm=3 。
  2. 存储描述持续性作用域链接性声明举例
    自动变量自动代码块在代码块函数中int a = 0;
    静态,无链接性变量静态代码块在代码块函数中,使用关键字staticstatic int a = 0;(函数体内)
    静态,外部链接性变量静态文件外部不在任何函数内,放置在全局int a = 0;(全局)
    静态,内部链接性变量静态文件内部不在任何函数内,使用static声明static int a = 0;(全局)
3. 静态外部链接性变量可以在不同文件中使用,但是只能有一个文件定义一个该变量,其他文件必须使用关键字extern声明改变量,例如extern int a;相同的变量名放置在不同文件全局,如果不使用以上方法的话,只能设置为一个是外部链接和一个是内部链接的变量。 4. 命名空间注意点: 命名空间可以是全局的,也可以位于另一个命名空间。
	namespace element{namespace fire{int flame;}int water}

命名空间具有传递性,如下图using namespace myth;等于using namespace elemet;加上using namespace myth;

	namespace myth{using std::cout;using std::cin;using namespace element;		}

可以给命名空间建立别名

	namespace myth=very_myth_namespace;

可以通过一下方式简化对于嵌套命名空间的使用

	namespace MEFF=myth::element::fire;using MEF::flame;

可以使用没有名字的命名空间

	namespace {int ice;}

可以在不同文件对同一命名空间添加相关数据,但是,但是如果有文件没有包含某个文件,但是包含其他和该文件一样命名空间的文件,那么是不能使用该文件的相关数据的。
5. 定位new运算符可以从程序员选择的指定位置分配一块空间给变量,其作用是设置该变量的内存管理规程,处理需要通过特定地址进行访问的硬件或者在特定位置创建对象。

	#include<iostream>#include<new>const int BUF = 512;const int N = 5;char buffer[BUF];int main(){double* pd1, * pd2;int i;pd1 = new double[N];pd2 = new (buffer) double[N];for (int i = 0; i < N; ++i){pd2[i] = pd1[i] = 1000 + 20.0 * i;}std::cout << "Memory addresses:\n";std::cout << "heap: " << pd1 << " static:" << (void*)buffer << std::endl;std::cout << "Memory contents:\n";for (int i = 0; i < N; ++i){std::cout << pd1[i] << " at " << &pd1[i] << "; ";std::cout << pd2[i] << " at " << &pd2[i] << std::endl;}double* pd3, * pd4;pd3 = new double[N];pd4 = new (buffer) double[N];for (int i = 0; i < N; ++i){pd3[i] = pd4[i] = 1000 + 40.0 * i;}std::cout << "Memory contents:\n";for (int i = 0; i < N; ++i){std::cout << pd3[i] << " at " << &pd3[i] << "; ";std::cout << pd4[i] << " at " << &pd4[i] << std::endl;}delete[] pd1;pd1 = new double[N];pd2 = new (buffer + N * sizeof(double)) double[N];for (int i = 0; i < N; ++i)pd2[i] = pd1[i] = 1000 + 60.0 * i;std::cout << "Memory contents;\n";for (int i = 0; i < N; ++i){std::cout << pd1[i] << " at " << &pd1[i] << "; ";std::cout << pd2[i] << " at " << &pd2[i] << std::endl;}delete[] pd1;delete[] pd3;return 0;}
	Memory addresses:heap: 000001AE8B4685E0 static:00007FF72FC9F440Memory contents:1000 at 000001AE8B4685E0; 1000 at 00007FF72FC9F4401020 at 000001AE8B4685E8; 1020 at 00007FF72FC9F4481040 at 000001AE8B4685F0; 1040 at 00007FF72FC9F4501060 at 000001AE8B4685F8; 1060 at 00007FF72FC9F4581080 at 000001AE8B468600; 1080 at 00007FF72FC9F460Memory contents:1000 at 000001AE8B468570; 1000 at 00007FF72FC9F4401040 at 000001AE8B468578; 1040 at 00007FF72FC9F4481080 at 000001AE8B468580; 1080 at 00007FF72FC9F4501120 at 000001AE8B468588; 1120 at 00007FF72FC9F4581160 at 000001AE8B468590; 1160 at 00007FF72FC9F460Memory contents;1000 at 000001AE8B468490; 1000 at 00007FF72FC9F4681060 at 000001AE8B468498; 1060 at 00007FF72FC9F4701120 at 000001AE8B4684A0; 1120 at 00007FF72FC9F4781180 at 000001AE8B4684A8; 1180 at 00007FF72FC9F4801240 at 000001AE8B4684B0; 1240 at 00007FF72FC9F488

定位new运算符将pd2放在buffer数组里面,但是程序会将buffer数组进行强制转换成(void *)。
定位new运算符将不识别哪些内存单元已经被使用过,也不查找未使用的内存块,仅仅根据程序员分配的位置作为起始位置来分配地址
delete只能处理指向常规new运算符分配的堆内存,而不处理定位new运算符,所以通过使用定位new运算符分配的空间不能使用delete处理。

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

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

相关文章

rpm安装mysql8后碰到的问题

1 mysqld 无法启动 原因 已经使用了3306端口&#xff0c;修改my.cnf中端口为3308 2 修改为3308端口后&#xff0c;还是无法启动&#xff0c; 2023-10-07T02:20:10.096689Z 0 [ERROR] [MY-010262] [Server] Cant start server: Bind on TCP/IP port: Permission denied 2023…

Node-RED系列教程-25node-red获取天气

安装节点:node-red-contrib-weather 节点图标如下: 使用说明:node-red-contrib-weather (node) - Node-RED 流程图中填写经度和纬度即可。 演示: json内容: {

Linux服务器报错“No space left on device”如何解决

一、错误的含义&#xff0c;说明在服务器设备上的存储空间已经满了&#xff0c;不能再上传或者新建文件夹或者文件等。 二、确认查看服务器系统的磁盘使用情况是否是真的已经没有剩余空间&#xff0c;复制下面命令在服务器上运行&#xff0c;然后发现如果如下图所示那么表明sda…

ViewConfiguration

包含 UI 中用于超时、大小和距离的标准常量的方法。 官址链接&#xff1a;https://developer.android.google.cn/reference/kotlin/android/view/ViewConfiguration?hlen 比如获取屏幕边缘的距离&#xff1a; val config ViewConfiguration.get(context) val edgeSlop con…

Sharding-JDBC(十)如何解决根据ID更新时扫描全部分表

目录 一、问题描述二、问题解决1.场景一&#xff1a;同一事务中&#xff0c;新增并更新1.1 解决方案&#xff1a; 2.场景二&#xff1a;不同事务中&#xff0c;新增后更新场景2.1 解决方案&#xff1a; 一、问题描述 我们在使用 ShardingJDBC 作为分片工具的时候&#xff0c;会…

代码随想录算法训练营第23期day14|二叉树层序遍历、226.翻转二叉树、101. 对称二叉树

目录 一、二叉树层序遍历 非递归法 递归法 相关题目&#xff08;10题&#xff09; 二、&#xff08;leetcode 226&#xff09;翻转二叉树 递归法 层序遍历 深度优先遍历 1&#xff09;非统一写法——前序遍历 2&#xff09; 统一写法——前序遍历 三、&#xff08;le…

04_数据库

1 Web架构 web总共分为三个部分&#xff1a; 客户端服务器数据库 web网站访问过程&#xff1a; 客户端向服务器发送请求服务器操作数据库数据库将结果返回给服务器服务器将结果响应给客户端 2 数据库概念 数据库&#xff08;Database&#xff09; 数据库是按照数据结构来…

软件测试/测试开发丨App自动化测试-弹窗异常处理

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27692 黑名单处理 运行过程中不定时弹框&#xff08;广告弹窗&#xff0c;升级提示框&#xff0c;新消息提示框等等&#xff09; 弹框不是 BUG&#xff0…

docker数据管理和网络通信

docker数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a; 数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷 数据卷是一个供容器使用的特殊目录&#xff0c;位于容器中。可将宿主机…

测试工程师思维学习

一、测试工程师应具备什么思维&#xff1f; 透过现象看本质&#xff0c;拒绝“一叶障目” 01、质疑和系统思维 02、创新思维 03、全局思维 04、风险驱动和组合思维 05、用户为中心和比较思维 06、BT思维和架构扩展性思维 二、测试工程师应避免的思维 01、同化现象 02、定位效…

数据结构-----二叉排序树

目录 前言 1.什么是二叉排序树 2.如何构建二叉排序树 3.二叉排序树的操作 3.1定义节点储存方式 3.2插入节点操作 3.2创建二叉排序树 3.4遍历输出&#xff08;中序遍历&#xff09; 3.5数据查找操作 3.6获取最大值和最小值 3.7删除节点操作 3.8销毁二叉排序树 4.完…

AdaBoost(上):数据分析 | 数据挖掘 | 十大算法之一

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

Zookeeper经典应用场景实战(二)

文章目录 1、 Zookeeper 分布式锁实战1.1、 什么是分布式锁1.2、 基于数据库设计思路1.3、 基于Zookeeper设计思路一1.4、 基于Zookeeper设计思路二 1、 Zookeeper 分布式锁实战 1.1、 什么是分布式锁 在单体的应用开发场景中涉及并发同步的时候&#xff0c;大家往往采用Sync…

DRM全解析 —— CRTC详解(1)

本文参考以下博文&#xff1a; Linux内核4.14版本——drm框架分析(4)——crtc分析 特此致谢&#xff01; 1. 简介 CRTC实际上可以拆分为CRTC。CRT的中文意思是阴极摄像管&#xff0c;就是当初老电视上普遍使用的显像管&#xff08;老电视之所以都很厚&#xff0c;就是因为它…

【状态估计】将变压器和LSTM与卡尔曼滤波器结合到EM算法中进行状态估计(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

并发工具类库使用的常见问题

一、ThreadLocal在多线程环境中没有清理 由于ThreadLocal是和线程绑定的&#xff0c;如果线程被复用了&#xff0c;也即使用了线程池&#xff0c;那么ThreadLocal中的值是可能被复用的&#xff0c;这个特性如果是开发者没有预料到的&#xff0c;那么会产生很大的问题。例如&am…

人机言语交互模型的评估要素

智能客服中的言语交互模型评估要素&#xff0c;主要包括以下几个方面&#xff1a; 有效性&#xff1a;指模型能否准确识别和理解用户的言语意图&#xff0c;以及生成正确和合适的回答。可以通过比较模型生成的回答与人工回答的准确率来评估。流畅性&#xff1a;指模型在回答问…

【单调栈】下一个更大元素 II

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;单调栈循环数组 写在最后 Tag 【单调栈循环数组】【数组】 题目来源 503. 下一个更大元素 II 题目解读 在循环数组中找下一个更大的元素。循环数组指的是&#xff0c;数组的最后一个元素的下一个元素是数组首元素。 …

C语言之动态内存管理篇(1)

目录 为什么存在动态内存分配 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 今天收假了&#xff0c;抓紧时间写几篇博客。我又来赶进度了。今天我们来讲解动态内存管理。&#x1f197;&#x1f197; 为什么存在动态内存分配 假设我们去实现一个…

pip永久换源,虚拟环境

1 pip永久换源 2 虚拟环境 pip永久换源 # 自己写一个模块--->传到pypi上 # 安装第三方模块-清华&#xff0c;阿里云 pip install -i 源地址 模块名字# 永久换源 1、文件管理器文件路径地址栏敲&#xff1a;%APPDATA% 回车&#xff0c;快速进入 C:\Users\电脑用户\AppDat…