堆和栈内存的比较 in C++【C++学习笔记】

堆和栈内存的比较 in C++【C++学习笔记】,第1张

54堆和栈内存的比较 in C++

当我们的程序开始的时候,程序被分成了一堆不同的内存区域,除了堆和栈以外,还有很多东西,但我们最关心这两个

🍅论栈和堆的琐事

栈通常是一个预定义大小的内存区域,通常约为2兆字节左右

堆也是一个预定义了默认值的区域,但是它可以生长,并随着应用程序的进行而改变

重要的是,这两个内存区域的实际位置(物理位置)在ram中是完全一样的!(并不是一个存在CPU缓存而另一个存在其他地方)

在程序中,内存是用来实际储存数据的。

我们需要一个地方来储存允许程序所需要的数据(比如局部变量or从文件中读取的东西)。

而栈和堆,它们就是可以储存数据的地方,但栈和堆的工作原理非常非常不同,但本质上它们做的事情是一样的

🍅栈和堆的区别

栈和堆的不同之处在于:如何为我们分配内存(一个用new,一个不用)

int main() {
    //在栈上分配
    int val = 5;
    
    //在堆上分配
    int *hval = new int;	//区别是,我们需要用new关键词来在堆上分配
    *hval = 5;
}
内存分配的区别:

在栈上,分配的内存都是连续的。

添加一个int,则栈指针(栈顶部的指针)就移动4个字节,所以连续分配的数据在内存上都是连续的,紧挨着的。

栈分配数据是直接把数据堆在一起(所做的就是移动栈指针),所以栈分配数据会很快。

  • 如果离开作用域,在栈中分配的所有内存都会d出,被释放

在堆上,分配的内存都是不连续的,new实际上做的是在内存块的空闲列表中找到空闲的内存块,然后把它用一个指针圈起来,然后返回这个指针。

(但如果空闲列表找不到合适的内存块,则会询问 *** 作系统索要更多内存,而这种 *** 作是很麻烦的,潜在成本是巨大的)

  • 离开作用域后,堆中的内存仍然存在

这里想表达的是:在栈上分配内存很轻便快捷,在堆上分配内存相当麻烦

💡💡💡所以能在栈上分配就在栈上分配,不能够在栈上分配时或者有特殊需求时(比如需要生存周期比函数作用域更长,或者需要分配一些大的数据),才需要在堆上分配!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/674839.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-19
下一篇 2022-04-19

发表评论

登录后才能评论

评论列表(0条)

保存