0
点赞
收藏
分享

微信扫一扫

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

孟祥忠诗歌 2022-04-16 阅读 68
c++

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

🍅论栈和堆的琐事

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

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

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

🍅栈和堆的区别

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

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

内存分配的区别:

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

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

在堆上,分配的内存都是不连续的,new实际上做的是在内存块的空闲列表中找到空闲的内存块,然后把它用一个指针圈起来,然后返回这个指针。(但如果空闲列表找不到合适的内存块,则会询问操作系统索要更多内存,而这种操作是很麻烦的,潜在成本是巨大的)

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

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

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

举报

相关推荐

0 条评论