应用程序启动后,操作系统会将整个程序加载到内存,并分配一大堆物理ram,以便应用程序可以运行,栈和堆是ram中实际存在的两个区域;栈通常是一个预定义大小的内存区域,通常约为2兆字节左右,堆也是一个预定义了默认值的区域,但它可以生长,并随着应用程序的进行而改变。需要一个地方来存储运行程序所需的数据,不管是局部变量还是从文件中读取的东西,我们需要处理或存储这些数据,可以要求C++从堆或栈中给我们一些内存,然后它会提供要求大小的内存块,如果一切顺利的话。
Stack 栈:在栈上分配内存像一条CPU指令,理解为可以类似放到CPU缓存线上(Cache Line可以理解为CPU Cache中的最小缓存单位);
Heap 堆:在堆上分配内存时一堆的事情,可能出现Cache miss缓存不命中的情况(CPU要访问的数据在Cache中有,称为hit,反之称为miss),就是说在堆上给的内存不够。
建议一般都在栈上创建,只有不能在栈上创建时在堆上创建,比如需要这个生命周期比函数的作用域更长,或者你在处理的作用域更长,或者你特别需要更多的数据(eg.50MB)
案例如下:
#include <iostream>
#include <string>
struct Vector3
{
float x, y, z;
Vector3() //使用构造函数
:x(10), y(11), z(12) {} //赋值,浮点数
};
int main()
{
//这时栈上创建
int value = 5; //栈上分配,栈指针找到内存块,反向数内存块数量,然后返回最后栈指针地址;最开始的地址最高,value地址最高,array次之,vector最低;内存是叠加在一起的
int array[5];
array[0] = 0;
array[1] = 1;
array[2] = 2;
array[3] = 3;
array[4] = 4;
Vector3 vector;//一旦在栈中分配内存的这个作用域结束,栈中分配的所有内存都会被弹出被释放
//这是堆上创建
int* hvalue = new int; //如果使用智能指针 make_unique或make_shared,它会为你调用new,并释放内存;new关键字调用了malloc的函数(memory allocate),调用底层操作系统或平台的特定函数,这将在堆上分配内存,启动程序时,得到一定数量的物理ram,分配给你,你的程序会维护一个叫做空闲列表free list,它会跟踪哪些内存块时空闲的
*hvalue = 5; //堆上分配
int* harray = new int[5];
harray[0] = 0;
harray[1] = 1;
harray[2] = 2;
harray[3] = 3;
harray[4] = 4;
Vector3* hvector = new Vector3(); //()可选
delete hvalue;
delete[] harray;
delete hvector;
std::cin.get();
}
设置后才能找到汇编代码:
看下Ctrl+F7后的汇编代码(debug模式下编译的代码有很多,在release模式下会干净一些)
可以在项目文件夹中找到汇编代码: