C++在内存的什么地方创建栈和堆?

Where does C++ create stack and heap in memory?

我使用的是 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

Where does C++ create stack and heap in memory?

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

1) Does that mean that my IDE is not using more than 4GBs out of my memory?

不,不是真的。事实上,像 Windows 这样的现代 OS 使用所谓的 virtual address space。它将明显连续的内存段(比如 0x10000xffff)映射到 virtual space 的一段,仅供您的程序使用;您绝对不能保证对象在内存中的实际位置。当一个地址被取消引用时,OS 会施展魔法,让您的程序访问内存中的物理地址。

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

2) Is the IDE able to address only the first 4GB of my memory or any 4GB out of the 8GBs not used?

任何。甚至non-contiguous内存,甚至磁盘内存...谁也说不清。

在有关它的评论中找到了一些微软来源:https://msdn.microsoft.com/en-us/library/aa366778.aspx