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

问题描述 投票:1回答:1

我正在使用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

c++ memory memory-management heap-memory stack-memory
1个回答
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吗?

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

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

© www.soinside.com 2019 - 2024. All rights reserved.