54堆和栈内存的比较 in C++
当我们的程序开始的时候,程序被分成了一堆不同的内存区域,除了堆和栈以外,还有很多东西,但我们最关心这两个
🍅论栈和堆的琐事
栈通常是一个预定义大小的内存区域,通常约为2兆字节左右
堆也是一个预定义了默认值的区域,但是它可以生长,并随着应用程序的进行而改变
重要的是,这两个内存区域的实际位置(物理位置)在ram中是完全一样的!(并不是一个存在CPU缓存而另一个存在其他地方)
在程序中,内存是用来实际储存数据的。我们需要一个地方来储存允许程序所需要的数据(比如局部变量or从文件中读取的东西)。而栈和堆,它们就是可以储存数据的地方,但栈和堆的工作原理非常非常不同,但本质上它们做的事情是一样的
🍅栈和堆的区别
栈和堆的不同之处在于:如何为我们分配内存(一个用new,一个不用)
int main() {
//在栈上分配
int val = 5;
//在堆上分配
int *hval = new int; //区别是,我们需要用new关键词来在堆上分配
*hval = 5;
}
内存分配的区别:
在栈上,分配的内存都是连续的。添加一个int,则栈指针(栈顶部的指针)就移动4个字节,所以连续分配的数据在内存上都是连续的,紧挨着的。栈分配数据是直接把数据堆在一起(所做的就是移动栈指针),所以栈分配数据会很快。
- 如果离开作用域,在栈中分配的所有内存都会弹出,被释放
在堆上,分配的内存都是不连续的,new
实际上做的是在内存块的空闲列表中找到空闲的内存块,然后把它用一个指针圈起来,然后返回这个指针。(但如果空闲列表找不到合适的内存块,则会询问操作系统索要更多内存,而这种操作是很麻烦的,潜在成本是巨大的)
- 离开作用域后,堆中的内存仍然存在
这里想表达的是:在栈上分配内存很轻便快捷,在堆上分配内存相当麻烦
💡💡💡所以能在栈上分配就在栈上分配,不能够在栈上分配时或者有特殊需求时(比如需要生存周期比函数作用域更长,或者需要分配一些大的数据),才需要在堆上分配!