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。。。
一张图说明: