【问题标题】:Where does C++ create stack and heap in memory?C++ 在内存中哪里创建栈和堆?
【发布时间】:2017-06-15 15:17:24
【问题描述】:

我正在使用 Microsoft Visual Studio 2008

当我创建一个指向对象的指针时,它会收到一个内存地址,在我的例子中是一个 8 位十六进制数。例如:0x02e97fc0

使用 8 个十六进制数字,计算机可以寻址 4GB 的内存。我的电脑有 8GB 内存:

  1. 这是否意味着我的 IDE 没有使用超过 4GB 的内存?

  2. IDE 是否只能处理我内存的前 4GB 或未使用的 8GB 内存中的任何 4GB?

问题不仅仅在于所用内存的大小。这也与使用的内存的位置有关。后者这里不详述:The maximum amount of memory any single process on Windows can address

【问题讨论】:

  • 前导 0 通常会被删除,因为它们不会改变值。
  • 为 64 位目标编译也将授予您 64 位指针,从而能够寻址更多内存空间。
  • “我的 IDE”——这是一个集成开发环境。 IDE 的编辑器部分并不在意。决定使用 32 位的是编译器部分。链接器跟随编译器。

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


【解决方案1】:

C++ 在内存中哪里创建栈和堆?

嗯,C++ 并没有真正处理内存,它要求操作系统这样做。当二进制对象(.exe、.dll、.so ...)加载到内存中时,这是为堆栈分配内存的操作系统。当您使用new 动态分配内存时,您是在向操作系统请求堆中的一些空间。

1) 这是否意味着我的 IDE 没有使用超过 4GB 的内存?

不,不是真的。事实上,像 Windows 这样的现代操作系统使用所谓的virtual address space。它将一个明显连续的内存段(比如0x10000xffff)映射到仅用于您的程序的虚拟 空间段;你绝对不能保证你的对象在内存中的真正位置。当一个地址被取消引用时,操作系统会做一些魔术,让你的程序访问内存中的物理地址。

拥有 32 位地址意味着您的程序的单个实例不能使用超过 4GB 的内存。同一程序的两个实例可以,因为操作系统可以在明显相同的虚拟地址段内分配两个不同的物理地址段(0x000000000xffffffff)。而且 Windows 将为其自己的进程分配更多重叠的地址空间。

2) IDE 是否只能处理我的前 4GB 内存或未使用的 8GB 内存中的任何 4GB?

任何。甚至不连续的内存,甚至磁盘内存......没有人能说出来。

在有关它的 cmets 中找到了一些 Microsoft 资源:https://msdn.microsoft.com/en-us/library/aa366778.aspx

【讨论】:

  • 这是否也意味着,当我检索对象的地址时,我得到的只是虚拟地址,而不是物理地址? (否则我可能会破坏其他程序的一部分。)
  • 是的,您只处理虚拟地址。这不仅是为了保护进程之间的相互攻击,也是为了让操作系统更有效地处理物理内存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-26
  • 2011-11-07
  • 2012-04-04
  • 1970-01-01
  • 2011-06-25
  • 2014-08-14
相关资源
最近更新 更多