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

时间:2017-01-30 12:48:36

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

我正在使用Microsoft Visual Studio 2008

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

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

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

  2. IDE能够仅处理我的内存的前4GB或未使用的8GB中的任何4GB吗?

  3. 问题不仅在于所用内存的大小。它还涉及所用内存的位置。后者尚未详细说明:The maximum amount of memory any single process on Windows can address

1 个答案:

答案 0 :(得分:5)

  

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

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

  

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

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

Diagram of relationship between the virtual and physical address spaces.

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

  

2)IDE能够仅处理我的内存的前4GB或未使用的8GB中的任何4GB吗?

不限。即使是非连续的内存,甚至是磁盘内存......没有人能分辨出来。

在评论中发现了一些Microsoft来源:https://msdn.microsoft.com/en-us/library/aa366778.aspx

相关问题