2017-01-30 67 views
1

我正在使用Microsoft Visual Studio 2008C++在内存中创建堆栈和堆?

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

随着8个十六进制数字的计算机可以解决4GB内存。我的电脑里有8GB的内存:

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

  2. 是IDE能够解决只有我的记忆中第一个4GB或4GB任何从8GBs不使用呢?

问题不仅仅是关于所用内存的大小。这也是关于所用内存的位置。后者在此处未详细说明:The maximum amount of memory any single process on Windows can address

+0

0领先的往往是下降,因为他们不改变价值。 – NathanOliver

+1

为64位目标编译也会授予你64位指针,从而可以寻址更多的内存空间。 – Steeve

+0

可能重复的[Windows上的任何单个进程的最大内存量可以解决](http://stackoverflow.com/questions/11891593/the-maximum-amount-of-memory-any-single-process-on-windows -can-address) –

回答

4

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

+0

这是否也意味着,当我检索对象的地址时,我只能获取虚拟地址,而不是物理地址? (否则我可能会破坏其他程序的一部分。) – Attis

+0

是的,你只处理虚拟地址。这不仅是为了保护进程彼此之间的关系,而且还要让操作系统更有效地处理物理内存。 – YSC