堆和栈内存的比较

应用程序启动后,操作系统会将整个程序加载到内存,并分配一大堆物理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模式下会干净一些)
在这里插入图片描述
可以在项目文件夹中找到汇编代码:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值