码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 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 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>
    在这里插入图片描述

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

  • 相关阅读:
    【Kettle】windwos环境 Kettle以命令行方式运行
    测试架构师如何落地性能测试方案(一)
    A1140 Look-and-say Sequence(20分)PAT 甲级(Advanced Level) Practice(C++)满分题解【字符串处理】
    SQL语言的分类:DDL(数据库、表的增、删、改)、DML(数据的增、删、改)
    读写分离后,性能居然提升100%了呀
    nginx(三十九) ngx_http_realip_module模块学习
    初阶数据结构 二叉树常用函数 (二)
    Furion api npm web vue混合开发
    uniapp介绍
    java游戏服务器性能压测神器:jprofiler
  • 原文地址:https://blog.csdn.net/silencestarsky/article/details/139841732
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号