C++初学者指南第一步---10.内存(基础)
C++初学者指南第一步—10.内存(基础)
文章目录
- C++初学者指南第一步---10.内存(基础)
- 1.内存模型
- 1.1 纸上谈兵:C++的抽象内存模型
- 1.2 实践:内存的实际处理
- 2. 自动存储
- 3.动态存储:std::vector
- 3.1 动态内存分配
- 3.2 std::vector 内存布局
- 3.3 std::vector 扩容方案
- 3.4 std::vector的大小(size)和容量(capacity)
- 3.5 std::vector内存生命周期示例
1.内存模型
1.1 纸上谈兵:C++的抽象内存模型
C++ 的语言规范基于抽象内存模型。
具体实现(编译器,C++运行时等)可以采用不同策略来满足具体平台(CPU架构,操作系统等)上的这些规范。
内存组织
示例:std::int16_t i = 1234; 是一个名为 i 的对象,大小为 2 字节(= 16 位),值为 0000010011010010,
根据其类型 int16_t 表示数字 1234。
请注意,抽象模型并没有涉及到内存是如何划分的,也不涉及缓存层次结构。
对象存储持续时间类型
自动 | 对象生存期绑定到 { … } 块作用域的开始到结束 | 局部变量、函数参数 |
动态 | 通过特殊指令控制对象寿命 | 可以按需创建/销毁且独立于块作用域的对象 |
线程 | 与线程的开始和结束相关的对象生存期 | 每线程存储 |
静态 | 对象生存期与程序的开始和结束相关联 | 单例 |
1.2 实践:内存的实际处理
C++内存模型的实际实现
- 受到目标平台的功能和限制的限制 (CPU/内存架构、操作系统、编译器)
- 需要修复C++标准留下的选项,例如字节中的位数(在大多数平台上为8)
- 需要支持c++标准描述的对象存储期/生命周期方案(自动、动态、线程、静态)
常见的解决方案:自动/动态存储期专用内存分区
HEAP 堆(也被称为自由存储区)
- 用于动态存储期对象,例如std::vector的内容
- 空间大:可用于大容量存储(大部分主内存)
- 根据需要分配和释放任何对象。
- 无序分配和释放 ⇒ 导致内存碎片化
- 分配缓慢:需要为新对象找到连续的空置空间
STACK 栈(堆栈)
- 用于自动存储持续时间局部变量、函数参数的对象等。
- 空间小(通常只有几 MB)
- 快速分配:新对象始终放在顶部
- 以创建的相反顺序释放分配的对象
- 无法释放分配在最顶部以下的对象 (= 最新)
2. 自动存储
栈通常用于自动存储持续时间的对象如局部变量(包括函数参数):
<1>
<2>
<3>
<4>
<5>
<6>
<7>
<8>
<9>
<10>
3.动态存储:std::vector
3.1 动态内存分配
当前:只使用std::vector
后面:使用更多的标准库容器(set、map…)
再后面:手动动态内存分配
在现代 C++ 中,手动分配内存实际上只有在你想要实现自己的动态数据结构/容器时才是真正必要的。
3.2 std::vector 内存布局
- 每个向量对象都有一个单独的缓冲区,该缓冲区是动态分配的(在堆上),实际内容存储在其中。
- 现在我们只知道如何在栈上分配对象,但向量对象 v 本身也可以在堆上分配(更多内容请参阅后面的章节)。
vector<int> v {0,1,2,3,4};
3.3 std::vector 扩容方案
- 分配后的内存块无法调整大小!(之前分配的内存块后面不一定有剩余空间)
- 动态数组实现将数组对象与用于存储值的实际内存块分开。
- 然后通过以下方式进行扩容:
- 动态分配新的、(≈1.1-2×)更大的内存块
- 将旧值复制/移动到新块
- 释放旧的、较小的内存块
动态数组(维基百科)
3.4 std::vector的大小(size)和容量(capacity)
- .size()→ 向量中的元素数量
- .resize(新的元素数量)
- . capacity() → 可以使用的内存槽数量(容量)
- .reserve(新的容量)
注意:如果您大概知道元素的数量 ⇒ 在将元素添加到向量之前先进行预留(reserve)!
这样可以避免在增长阶段时进行不必要的内存分配和复制。
3.5 std::vector内存生命周期示例
<1>
<2>
<3>
<4>
<5>
<6>
<7>
<8>
<9>
<10>
<11>
<12>
<13>
<14>
<15>
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^
相关文章:
![](https://img-blog.csdnimg.cn/direct/75f0aa9650494a42b0ba4557dc826cde.png#pic_center)
C++初学者指南第一步---10.内存(基础)
C初学者指南第一步—10.内存(基础) 文章目录 C初学者指南第一步---10.内存(基础)1.内存模型1.1 纸上谈兵:C的抽象内存模型1.2 实践:内存的实际处理 2. 自动存储3.动态存储:std::vector3.1 动态内…...
![](https://www.ngui.cc/images/no-images.jpg)
扩散模型详细推导过程——编码与解码
符号表 符号含义 x ( i ) z 0 ( i ) \boldsymbol{x}^{(i)}\boldsymbol{z}_0^{(i)} x(i)z0(i)第 i i i个训练数据,其为长度为 d d d的向量 z t ( i ) \boldsymbol{z}_t^{(i)} zt(i)第 i i i个训练数据在第 t t t时刻的加噪版本 ϵ t ( i ) \boldsymbol{\epsilo…...
![](https://www.ngui.cc/images/no-images.jpg)
js如何实现开屏弹窗
开屏弹窗是什么,其实就是第一次登录后进入页面给你的一种公告提示,此后再回到当前这个页面时弹窗是不会再出现的。也就是说这个弹窗只会出现一次。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>…...
![](https://www.ngui.cc/images/no-images.jpg)
C#——文件读取Directory类详情
文件读取Directory类 Durectory提供了目录以及子目录进行创建移动和列举操作方法 Directory和Directorylnfo类(主要操作文件目录属性列如文件是否隐藏的 或者只读等这些属性) Directory对目录进行复制、移动、重命名、创建和删除等操作DirectoryInfo用于对目录属性执行操作 …...
![](https://img-blog.csdnimg.cn/direct/a52743d573f745e4befd5744316879ce.png)
Ruby on Rails Post项目设置网站初始界面
在构建了Ruby的Web服务器后,第三步就可以去掉框架的官方页面,设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…...
![](https://img-blog.csdnimg.cn/direct/8d85482617ed49518789a2da231ce984.png)
03-QTWebEngine中使用qtvirtualkeyboard
qt提供了 virtualKeyboard 虚拟键盘模块,只需要在在main函数中最开始加入这样一句就可以了 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 但是在使用的时候遇到了一些问题: 1、中文输入的时候没有输入提示 Qvirt…...
![](https://www.ngui.cc/images/no-images.jpg)
leetcode3无重复字符的最长字串(重点讲滑动窗口)
本文主要讲解无重复字符的最长字串的要点与细节,根据步骤一步步走更方便理解 c与java代码如下,末尾 具体要点: 1. 区分一下子串和子序列 子串:要求元素在母串中是连续地出现 子序列:不要求连续 2. 题目中有两个核心…...
![](https://img-blog.csdnimg.cn/direct/aa0b52391be54afdbc5b39f989f334d9.png)
Gobject tutorial 八
The GObject base class Object memory management Gobject的内存管理相关的API很复杂,但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下,与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…...
![](https://img-blog.csdnimg.cn/img_convert/77a5bbfb274858f9c9e39e71406e104f.png#pic_center)
DDMA信号处理以及数据处理的流程---cfar检测
Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…...
【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现
📝个人主页:哈__ 期待您的关注 目录 📕引言 ⛓决策树的基本原理 1. 决策树的结构 2. 信息增益 熵的计算公式 信息增益的计算公式 3. 基尼指数 4. 决策树的构建 🤖决策树的代码实现 1. 数据准备 2. 决策树模型训练 3.…...
![](https://www.ngui.cc/images/no-images.jpg)
Zookeeper 集群节点故障剔除、切换、恢复原理
Zookeeper 集群节点故障剔除、切换、恢复原理 zookeeper 集群节点故障时,如何剔除节点,如果为领导节点如何处理,如何进行故障恢 复的,实现原理? 在 Zookeeper 集群中,当节点故障时,集群需要自动剔除故障节点并进行故障恢复,确保集群的高 可用性和一致性。具体来说,…...
![](https://www.ngui.cc/images/no-images.jpg)
解决帝国cms栏目管理拼音乱码的问题
帝国CMS7.5版本utf-8版网站后台增加栏目生成乱码的问题怎么解决 1、需要改一个函数,并且增加一个处理文件,方法如下: 修改e/class/connect.php文件,找到ReturnPinyinFun函数,如未修改文件在4533-4547行,将…...
![](https://img-blog.csdnimg.cn/direct/c8edbd5596224407bcbf4d35d2f85846.png)
Git快速入门
一 快速使用 1.1 初始化 什么是版本库呢?版本库又名仓库,可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改、删除,Git都能跟踪,以便任何时刻都可以追踪历史࿰…...
![](https://www.ngui.cc/images/no-images.jpg)
【18.0】JavaScript---事件案例
【18.0】JavaScript—事件案例 【一】开关灯事件 【介绍】设置一个按钮,按下按钮触发事件,来回切换圆形图片的颜色 【分析】 图片设置:设置成圆形的图片背景颜色:设置红绿两个颜色,来回切换按钮设置:点击…...
![](https://img-blog.csdnimg.cn/direct/ff8640497e7d40b690caa19981a6c05e.png)
推荐系统三十六式学习笔记:原理篇.矩阵分解12|如果关注排序效果,那么这个模型可以帮到你
目录 矩阵分解的不足贝叶斯个性化排序AUC构造样本目标函数训练方法 总结 矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统,又有机器学习的基因,可以说是非常优秀了;但即便如此,传统的矩阵分解无论是在处理显式反馈&…...
![](https://www.ngui.cc/images/no-images.jpg)
Kafka之ISR机制的理解
文章目录 Kafka的基本概念什么是ISRISR的维护机制ISR的作用ISR相关配置参数同步过程示例代码总结 Kafka中的ISR(In-Sync Replicas同步副本)机制是确保数据高可用性和一致性的核心组件。 Kafka的基本概念 在Kafka中,数据被组织成主题…...
![](https://img-blog.csdnimg.cn/direct/25152a61a65a490c97aa516750ac97c8.png)
如何设计一个点赞系统
首先我们定义出一个点赞系统需要对外提供哪些接口: 1.用户对特定的消息进行点赞; 2.用户查看自己发布的某条消息点赞数量以及被哪些人赞过; 3.用户查看自己给哪些消息点赞过; 这里假设每条消息都有一个message_id, 每一个用户都…...
![](https://www.ngui.cc/images/no-images.jpg)
对象存储测试工具-s3cmd
一、环境安装 官网:https://s3tools.org/s3cmd 下载安装包:https://s3tools.org/download GitHub:https://github.com/s3tools/s3cmd/releases 本文安装包:https://github.com/s3tools/s3cmd/releases/download/v2.0.2/s3cmd-2.0…...
![](https://www.ngui.cc/images/no-images.jpg)
OpenCV--图像色彩空间及转换
图像色彩空间及转换 python代码和笔记 python代码和笔记 import cv2 色彩空间,基础:RGB或BGR OpenCV中: 一、HSV(HSB):用的最多, Hue:色相-色彩(0-360),红色:0,绿色&…...
![](https://img-blog.csdnimg.cn/direct/58268a0ab78e4fbeb99491dea2b7d19a.png)
RIP解决不连续子网问题
#交换设备 RIP解决不连续子网问题 一、不连续子网的概念 相同主网下的子网,被另一个主网分割,例如下面实验拓扑在某公司的网络整改项目中,原先R1 和RS 属于同一主网络 10.0.0.0/8,现被 R2、R3、R4 分离,整网采用了 …...
![](https://img-blog.csdnimg.cn/img_convert/c69912111f11a6c9faf8f347d34782f8.jpeg)
动态轮换代理IP是什么?有什么用?
如果您要处理多个在线帐户,选择正确的代理类型对于实现流畅的性能至关重要。但最适合这项工作的代理类型是什么? 为了更好地管理不同平台上的多个账户并优化成本,动态住宅代理IP通常作用在此。 一、什么是轮换代理? 轮换代理充当…...
![](https://www.ngui.cc/images/no-images.jpg)
MAC配置VScode中C++项目debug环境
文章目录 配置步骤问题解决Unable to start debugging. LLDB exited unexpectedly with exit code 137 (0x89). 配置步骤 在Mac上配置VS Code以进行C调试涉及几个步骤: 安装必要的工具: 确保您已经安装了Visual Studio Code和C插件。 检查是否安装了Clang…...
![](https://www.ngui.cc/images/no-images.jpg)
PostgreSQL源码分析——CREATE CAST
CREATE CAST源码分析 CREATE CAST用法 CREATE CAST —— 定义一个用户自定义的类型转换 用法如下: CREATE CAST (source_type AS target_type)WITH FUNCTION function_name [ (argument_type [, ...]) ][ AS ASSIGNMENT | AS IMPLICIT ]CREATE CAST (source_type…...
![](https://img-blog.csdnimg.cn/direct/1b87d057c6424b6da8a567cf74f9c335.jpeg)
解锁5G新营销:视频短信的优势与全方位推广策略
随着5G时代的全面来临,企业的数字化转型步伐日益加快,视频短信作为新兴的数字营销工具,正逐步展现出其巨大的潜力。视频短信群发以其独特的形式和内容,将图片、文字、视频、声音融为一体,为用户带来全新的直观感受&…...
![](https://img-blog.csdnimg.cn/direct/4191fb0cbc1646aa9e16bdeca00228a4.jpeg)
视频监控平台功能:国外的硬盘录像机NVR通过ISUP协议(原ehome协议)接入AS-V1000视频平台
目录 一、背景说明 二、ISUP协议介绍 1、海康ISUP协议概述 2、ISUP协议支持主码流和子码流切换 (1)灵活配置和个性化 (2)适应不同网络带宽,提高使用体验 3、海康ehome相关文章 三、ISUP协议接入说明 1、平台侧…...
![](https://www.ngui.cc/images/no-images.jpg)
PostgreSQL查询用户
在 PostgreSQL 中,可以通过查询系统表来确定当前用户是否是超级管理员(超级用户)。具体来说,可以使用 pg_roles 系统表,该表包含数据库中所有角色的信息。 以下是查询当前用户是否是超级用户的 SQL 语句: …...
![](https://www.ngui.cc/images/no-images.jpg)
力扣1539.第k个缺失的正整数
力扣1539.第k个缺失的正整数 占位运算 只要n<k ,k;最终k就是结果 class Solution {public:int findKthPositive(vector<int>& arr, int k) {for(int n : arr){if(n < k) k ;else break;}return k;}};...
![](https://www.ngui.cc/images/no-images.jpg)
如何快速解决屏幕适配问题
下面将利用postcss插件快速解决屏幕适配问题。仅用少量代码,新手均可快速使用。 Step1. 安装 npm install postcss-px-to-viewport-8-plugin --save-dev Step2. 新建 postcss.config.js 文件,做基础配置 module.exports {plugins: {postcss-px-to-v…...
![](https://img-blog.csdnimg.cn/direct/5f5f470e80474c1ca29fa7a63abaab16.png)
Go基础编程 - 09 - 通道(channel)
通道(channel) 1. 声明2. channel的操作3. 无缓冲通道4. 有缓冲通道5. 如何优雅的从通道循环取值6. 单向通道7. 异常总结 上一篇:结构体 Go语言的并发模式:不要通过共享内存来通信,而应该通过通信来共享内存。 Go语言…...
![](https://img-blog.csdnimg.cn/direct/eb21ebc108ec4c82b370150f64ece423.png)
[SAP ABAP] 数据类型
1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息,并且可以存储8位数字 输出结果: 提示Tips:日期和时间类型的变量可以直接进…...
![](/images/no-images.jpg)
wordpress 注册字段/baidu百度
np.random.permutation 是 numpy 中的一个函数,它可以将一个数组中的元素随机打乱,返回一个打乱后的新数组。 使用方法如下: import numpy asnp# 对一个列表进行打乱 arr [1, 2, 3, 4, 5] np.random.permutation(arr)# 对一个 numpy 数组进行…...
![](/images/no-images.jpg)
天河企业网站建设/营销策划方案公司
下载原厂固件(Buffalo巴法络WHR-HP-G300N无线路由器固件1.93版)TFTP安装及配置(Ubuntu 14.04)sudo apt-get install tftp网络配置(路由器断电状态,并与计算机网口相连接)sudo service network-manager stop sudo …...
![](https://img-blog.csdnimg.cn/img_convert/06ace2c9604e5d84305a8bc4b2d224ae.png)
公众平台网站开发哪家好/佛山疫情最新情况
JPEGJEPG由联合图像专家小组(Joint Photographic Experts Group)于1992年创建,并以创建者命名。JPEG是一种有损光栅图像格式,这意味着每次压缩保存JPEG时,一些信息将发生不可逆转地丢失。JPEG利用人眼感知的缺陷 - 对亮度比对颜色更敏感 - 使…...
![](https://img-blog.csdnimg.cn/20201112132624111.png)
建材做网站好吗/独立网站怎么做
MQ和分布式事务 MQ 项目中RabbitMQ实现了at least once,包括mq反馈provider,消息持久化,consumer主动反馈mq.线程池消费防止消息积压等mq 通知时,消费者没消费到怎么办简单聊聊消息中间件?你了解那些具体的消息中间件产品?mq的消费端是怎么…...
![](https://img-my.csdn.net/uploads/201210/05/1349452147_8523.jpg)
网站如何免费做SEO优化/怎么去营销自己的产品
查看JVM各个参数值方式 1. HotSpot vm中的各个globals.hpp文件 查看jvm初始的默认值及参数 globals.hpp globals_extension.hpp c1_globals.hpp c1_globals_linux.hpp c1_globals_solaris.hpp c1_globals_sparc.hpp c1_globals_windows.hpp c1_globals_x86.hpp c2_glo…...
![](https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/Art/aps_feedback_binary_2x.png)
wordpress 知笔墨/广州搜索seo网站优化
这章描述了接口,这些接口是开发者用于和APNs服务器通信的,讨论了一些功能,这些功能是开发者期望能够达到的。 一般的开发者的要求 ##作为一个开发者你和APNs服务器的通信是通过一个二进制接口。这个接口对于开发者是一个高速度、高能量的&a…...