【问题标题】:What is the range of an address on stack and memory?堆栈和内存上的地址范围是多少?
【发布时间】:2013-08-31 03:31:46
【问题描述】:

在计算机内存上,比如 IA32,一般堆栈的范围是多少?我知道像 0xffff1234 这样的地址可能在堆栈上。例如,堆栈是否有可能增长到 0x0800abcd?堆呢?我知道堆地址总是低于堆栈地址,但通常它的范围是多少?还有堆下面的区域是什么?

堆栈 - 程序用于实际运行程序的内存。这包含局部变量、回调数据(例如,当您调用一个函数时,堆栈会存储您在进入新函数之前在代码中的状态和位置)以及其他一些类似性质的小东西。您通常不直接控制堆栈,变量和数据被销毁,在您移入和移出函数范围时创建。

堆 - 程序的“动态”内存。每次动态创建新对象或变量时,它都会存储在堆上。该内存由程序员直接控制,您应该负责那里的对象的创建和删除。

非常感谢!

【问题讨论】:

    标签: memory heap-memory stack-memory


    【解决方案1】:

    堆栈: 您可以在链接时定义堆栈的大小。 据我所知,Windows 应用程序默认堆栈大小为 2MB。 您可以在项目设置中更改堆栈的大小。但是在构建 App 时,堆栈大小是固定的。 操作系统会为堆栈溢出设置保护页面。如果任何操作尝试访问保护页面都会触发 EXCEPTION。

    堆: 我猜默认堆大小也可以在项目设置中更改。 因为在你的App中,你可以创建自己的堆,或者使用CRT堆,Win32堆。所以应该有很多堆。 当你尝试分配内存时,堆管理器会根据算法来分配内存。如果没有足够的内存,堆管理器会向虚拟内存管理器申请内存。直到用户地址空间中没有足够的内存,抛出异常:内存不足。 有几个定义:HeapNode、HeapSegment、LFH、LEA、BEA。 并且可以使用Windbg:!heap -s, !heap -a,这些命令来检查Windows Heap的结构。

    【讨论】:

      猜你喜欢
      • 2012-08-09
      • 2021-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-11-02
      • 2014-01-22
      • 1970-01-01
      • 2019-06-01
      • 2011-10-15
      相关资源
      最近更新 更多