怎么制作网站生成图片,网站后台英文,wordpress多站点文章调用,做网站备案是承诺书是啥C初学者指南第一步—10.内存#xff08;基础#xff09; 文章目录 C初学者指南第一步---10.内存#xff08;基础#xff09;1.内存模型1.1 纸上谈兵#xff1a;C的抽象内存模型1.2 实践#xff1a;内存的实际处理 2. 自动存储3.动态存储#xff1a;std::vector3.1 动态内…C初学者指南第一步—10.内存基础 文章目录 C初学者指南第一步---10.内存基础1.内存模型1.1 纸上谈兵C的抽象内存模型1.2 实践内存的实际处理 2. 自动存储3.动态存储std::vector3.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 本身也可以在堆上分配更多内容请参阅后面的章节。
vectorint 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
附上原文链接 如果文章对您有用请随手点个赞谢谢^_^