C++ 的语言规范基于抽象内存模型。
具体实现(编译器,C++运行时等)可以采用不同策略来满足具体平台(CPU架构,操作系统等)上的这些规范。
内存组织
示例:std::int16_t i = 1234; 是一个名为 i 的对象,大小为 2 字节(= 16 位),值为 0000010011010010,
根据其类型 int16_t 表示数字 1234。
请注意,抽象模型并没有涉及到内存是如何划分的,也不涉及缓存层次结构。
对象存储持续时间类型
自动 | 对象生存期绑定到 { … } 块作用域的开始到结束 | 局部变量、函数参数 |
动态 | 通过特殊指令控制对象寿命 | 可以按需创建/销毁且独立于块作用域的对象 |
线程 | 与线程的开始和结束相关的对象生存期 | 每线程存储 |
静态 | 对象生存期与程序的开始和结束相关联 | 单例 |
C++内存模型的实际实现
常见的解决方案:自动/动态存储期专用内存分区
HEAP 堆(也被称为自由存储区)
STACK 栈(堆栈)
栈通常用于自动存储期的对象如局部变量(包括函数参数):
<1>
<2>
<3>
<4>
<5>
<6>
<7>
<8>
<9>
<10>
当前:只使用std::vector
后面:使用更多的标准库容器(set、map…)
再后面:手动动态内存分配
在现代 C++ 中,手动分配内存实际上只有在你想要实现自己的动态数据结构/容器时才是真正必要的。
vector v {0,1,2,3,4};
<1>
<2>
<3>
<4>
<5>
<6>
<7>
<8>
<9>
<10>
<11>
<12>
<13>
<14>
<15>
附上原文链接
如果文章对您有用,请随手点个赞,谢谢!^_^