堆和栈的大小分析

一、来自csdn的讨论:面试题:一个进程的堆和栈有多大?-CSDN论坛-CSDN.NET-中国最大的IT技术社区


1、俗话说:一个进程一个堆,一个线程一个栈。也就是说栈是跟线程相关的,堆是跟进程相关。


2、栈在win32平台下默认1MB预留空间, 初次递交8KB,自动增长,具体使用要看线程调用栈的方式。所以如果进程中有N个线程,默认情况下有N*1MB的栈预留空间和小于这个数字的实际使用空间。


3、堆和Heap管理有关,默认存在系统堆和CRT堆。具体大小取决于程序本身对内存的分配和使用,可以调用HeapSize看实际使用大小,理论上说一个系统的虚拟内存有多大,堆的大小就有多大。另外还有虚拟内存,独立于堆外,直接通过VirtualAlloc预留或分配,也属于进程动态分配的内存。


4、栈大小固定(编译时确定),堆的大小实际上(运行时)动态变化的。栈的大小在编译器选项中可以设定,比如VS的项目属性-C++-命令行,在附加选项中可以设定。


二、来自stackoverflow上的讨论:memory management - What and where are the stack and heap? - Stack Overflow

1、栈是为了线程的运行而服务的。每当一个函数被调用时,栈顶的一个block保留用于局部变量和程序数据。函数返回时,这个block被释放以便下一次函数调用时使用。栈采用LIFO的顺序来存储,最经常被保留的block往往是下一个被释放的block。这使得跟踪一个block的使用变得很简单。


2、堆用于动态内存分配,对于它的block没有固定的分配和释放方式,所以可以随时随地释放和分配一个堆上的block。这也使得我们很难跟踪到堆上的一个block的使用情况,对于不用的使用模式来说,有很多典型的allocators来调整堆的性能。


3、栈要时刻考虑溢出的问题,分配速度快,类似于数据结构中的stack;堆几乎不用考虑不够的问题,除非特别的内存申请,分配速度慢,类似于数据结构中linked-list。

blablabla。。。


一张图说明:







  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值