堆,堆栈和数据存储单元的大小

时间:2013-11-18 23:11:34

标签: c++ c memory-management heap-memory stack-memory

这个问题有几个部分。

根据网上可用的大部分资源,根据教科书,堆和堆栈内存也在相反的方向增长。

  1. 堆和堆栈实际上总是朝着彼此相反的方向增长,特别是当操作系统为堆内存分配了额外的内存时?

  2. 考虑到最初在程序中,只发生堆分配并使用最小的堆栈内存。因此,Heap将覆盖为Stack和堆分配的几乎整个组合内存。之后,Stack开始增长。是否会抛出错误或者是否会为Stack分配新的内存位置以使其达到最大限制(最大限制=“ulimit -s”命令显示的限制)?如果可以分配新的位置,那么它是否违反了堆栈地址总是按顺序分配的条件?

  3. 数据部分中存储的初始化和未初始化变量对内存使用量是否有任何预定义限制?

1 个答案:

答案 0 :(得分:1)

数目:

Do Heap and Stack actually always grow in opposite directions towards each other,
especially when extra memory is allocated by the OS for Heap memory?  

堆和堆栈是一个实现细节,而不是语言规范所要求的。他们成长的方向不一定是彼此相对的;他们无论如何都可以成长。

Consider that initially in the program,  
only heap allocations take place and minimal Stack memory is used.  
Hence, Heap will cover almost entire combined memory allocated  
for Stack and heap. Afterwards, Stack starts to grow.  
Will an error be thrown or will new memory location be allotted  
for Stack to grow to its maximum limit
(maximum limit = limit shown by "ulimit -s" command)?  
If new location can be allotted, then doesn't it violate the condition  
that in Stack addresses are always assigned in order?  

如果你的堆和堆栈相互增长,可能会发生覆盖。如果内存分配器检查空间不足或者您有一个检查运行时堆栈分配的实用程序,则只会收到超限通知。请记住,并非所有平台都是Linux或Windows PC;许多是受限制的嵌入式系统。

Is there any pre-defined limit on the memory usage  
by initialized and uninitialized variables  
stored in Data section?  

是的,变量必须有某处内存。 OS可以将变量分页到外部设备。变量有可能不是变量而是硬件寄存器。同样,这是所有平台特定的。语言标准强加的规则是变量必须是可寻址的,静态或自动变量必须具有唯一的地址(单一定义规则,ODR)。