2017-01-30 106 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