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

Att*_*tis 1 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?

问题不仅在于所用内存的大小。它还与所用内存的位置有关。此处没有详细介绍:Windows上任何单个进程可以处理的最大内存量

YSC*_*YSC 5

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

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

1)这是否意味着我的IDE占用的内存不足4GB?

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

虚拟和物理地址空间之间的关系图。

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

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

任何。甚至不连续的内存,甚至磁盘内存……没人能告诉。

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