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

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.1-2×)更大的内存块
    2. 将旧值复制/移动到新块
    3. 释放旧的、较小的内存块
      在这里插入图片描述
      动态数组(维基百科)

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>
在这里插入图片描述

附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^

相关文章:

C++初学者指南第一步---10.内存(基础)

C初学者指南第一步—10.内存&#xff08;基础&#xff09; 文章目录 C初学者指南第一步---10.内存&#xff08;基础&#xff09;1.内存模型1.1 纸上谈兵&#xff1a;C的抽象内存模型1.2 实践&#xff1a;内存的实际处理 2. 自动存储3.动态存储&#xff1a;std::vector3.1 动态内…...

扩散模型详细推导过程——编码与解码

符号表 符号含义 x ( i ) z 0 ( i ) \boldsymbol{x}^{(i)}\boldsymbol{z}_0^{(i)} x(i)z0(i)​第 i i i个训练数据&#xff0c;其为长度为 d d d的向量 z t ( i ) \boldsymbol{z}_t^{(i)} zt(i)​第 i i i个训练数据在第 t t t时刻的加噪版本 ϵ t ( i ) \boldsymbol{\epsilo…...

js如何实现开屏弹窗

开屏弹窗是什么&#xff0c;其实就是第一次登录后进入页面给你的一种公告提示&#xff0c;此后再回到当前这个页面时弹窗是不会再出现的。也就是说这个弹窗只会出现一次。 <!DOCTYPE html> <html><head><meta charset"utf-8"><title>…...

C#——文件读取Directory类详情

文件读取Directory类 Durectory提供了目录以及子目录进行创建移动和列举操作方法 Directory和Directorylnfo类(主要操作文件目录属性列如文件是否隐藏的 或者只读等这些属性) Directory对目录进行复制、移动、重命名、创建和删除等操作DirectoryInfo用于对目录属性执行操作 …...

Ruby on Rails Post项目设置网站初始界面

在构建了Ruby的Web服务器后&#xff0c;第三步就可以去掉框架的官方页面&#xff0c;设置自己的网页初始页了。 Linux系统安装Ruby语言-CSDN博客 、在Ubuntu中创建Ruby on Rails项目并搭建数据库-CSDN博客、 Ruby语言建立Web服务器-CSDN博客 了解Ruby onRails项目中的主要文件…...

03-QTWebEngine中使用qtvirtualkeyboard

qt提供了 virtualKeyboard 虚拟键盘模块&#xff0c;只需要在在main函数中最开始加入这样一句就可以了 qputenv("QT_IM_MODULE", QByteArray("qtvirtualkeyboard")); 但是在使用的时候遇到了一些问题&#xff1a; 1、中文输入的时候没有输入提示 Qvirt…...

leetcode3无重复字符的最长字串(重点讲滑动窗口)

本文主要讲解无重复字符的最长字串的要点与细节&#xff0c;根据步骤一步步走更方便理解 c与java代码如下&#xff0c;末尾 具体要点&#xff1a; 1. 区分一下子串和子序列 子串&#xff1a;要求元素在母串中是连续地出现 子序列&#xff1a;不要求连续 2. 题目中有两个核心…...

Gobject tutorial 八

The GObject base class Object memory management Gobject的内存管理相关的API很复杂&#xff0c;但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下&#xff0c;与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…...

DDMA信号处理以及数据处理的流程---cfar检测

Hello,大家好,我是Xiaojie,好久不见,欢迎大家能够和Xiaojie一起学习毫米波雷达知识,Xiaojie准备连载一个系列的文章—DDMA信号处理以及数据处理的流程,本系列文章将从目标生成、信号仿真、测距、测速、cfar检测、测角、目标聚类、目标跟踪这几个模块逐步介绍,这个系列的…...

【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;引言 ⛓决策树的基本原理 1. 决策树的结构 2. 信息增益 熵的计算公式 信息增益的计算公式 3. 基尼指数 4. 决策树的构建 &#x1f916;决策树的代码实现 1. 数据准备 2. 决策树模型训练 3.…...

Zookeeper 集群节点故障剔除、切换、恢复原理

Zookeeper 集群节点故障剔除、切换、恢复原理 zookeeper 集群节点故障时,如何剔除节点,如果为领导节点如何处理,如何进行故障恢 复的,实现原理? 在 Zookeeper 集群中,当节点故障时,集群需要自动剔除故障节点并进行故障恢复,确保集群的高 可用性和一致性。具体来说,…...

解决帝国cms栏目管理拼音乱码的问题

帝国CMS7.5版本utf-8版网站后台增加栏目生成乱码的问题怎么解决 1、需要改一个函数&#xff0c;并且增加一个处理文件&#xff0c;方法如下&#xff1a; 修改e/class/connect.php文件&#xff0c;找到ReturnPinyinFun函数&#xff0c;如未修改文件在4533-4547行&#xff0c;将…...

Git快速入门

一 快速使用 1.1 初始化 什么是版本库呢&#xff1f;版本库又名仓库&#xff0c;可以简单理解成一个目录&#xff0c;这个目录里面的所有文件都可以被Git管理起来&#xff0c;每个文件的修改、删除&#xff0c;Git都能跟踪&#xff0c;以便任何时刻都可以追踪历史&#xff0…...

【18.0】JavaScript---事件案例

【18.0】JavaScript—事件案例 【一】开关灯事件 【介绍】设置一个按钮&#xff0c;按下按钮触发事件&#xff0c;来回切换圆形图片的颜色 【分析】 图片设置&#xff1a;设置成圆形的图片背景颜色&#xff1a;设置红绿两个颜色&#xff0c;来回切换按钮设置&#xff1a;点击…...

推荐系统三十六式学习笔记:原理篇.矩阵分解12|如果关注排序效果,那么这个模型可以帮到你

目录 矩阵分解的不足贝叶斯个性化排序AUC构造样本目标函数训练方法 总结 矩阵分解在推荐系统中的地位非常崇高。它既有协同过滤的血统&#xff0c;又有机器学习的基因&#xff0c;可以说是非常优秀了&#xff1b;但即便如此&#xff0c;传统的矩阵分解无论是在处理显式反馈&…...

Kafka之ISR机制的理解

文章目录 Kafka的基本概念什么是ISRISR的维护机制ISR的作用ISR相关配置参数同步过程示例代码总结 Kafka中的ISR&#xff08;In-Sync Replicas同步副本&#xff09;机制是确保数据高可用性和一致性的核心组件。 Kafka的基本概念 在Kafka中&#xff0c;数据被组织成主题&#xf…...

如何设计一个点赞系统

首先我们定义出一个点赞系统需要对外提供哪些接口&#xff1a; 1.用户对特定的消息进行点赞&#xff1b; 2.用户查看自己发布的某条消息点赞数量以及被哪些人赞过&#xff1b; 3.用户查看自己给哪些消息点赞过&#xff1b; 这里假设每条消息都有一个message_id, 每一个用户都…...

对象存储测试工具-s3cmd

一、环境安装 官网&#xff1a;https://s3tools.org/s3cmd 下载安装包&#xff1a;https://s3tools.org/download GitHub&#xff1a;https://github.com/s3tools/s3cmd/releases 本文安装包&#xff1a;https://github.com/s3tools/s3cmd/releases/download/v2.0.2/s3cmd-2.0…...

OpenCV--图像色彩空间及转换

图像色彩空间及转换 python代码和笔记 python代码和笔记 import cv2 色彩空间&#xff0c;基础&#xff1a;RGB或BGR OpenCV中&#xff1a; 一、HSV(HSB)&#xff1a;用的最多&#xff0c; Hue&#xff1a;色相-色彩(0-360)&#xff0c;红色&#xff1a;0&#xff0c;绿色&…...

RIP解决不连续子网问题

#交换设备 RIP解决不连续子网问题 一、不连续子网的概念 相同主网下的子网&#xff0c;被另一个主网分割&#xff0c;例如下面实验拓扑在某公司的网络整改项目中&#xff0c;原先R1 和RS 属于同一主网络 10.0.0.0/8&#xff0c;现被 R2、R3、R4 分离&#xff0c;整网采用了 …...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

MVC 数据库

MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

go 里面的指针

指针 在 Go 中&#xff0c;指针&#xff08;pointer&#xff09;是一个变量的内存地址&#xff0c;就像 C 语言那样&#xff1a; a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10&#xff0c;通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...