2017-09-15 121 views
8

當我使用new []關鍵字(或new運算符)時,它是否連續分配內存?新[]是否連續分配內存?

int* arr = new int[10]; 

我的意思是,是否有任何保證,即ARR [0]ARR [1]緊密放置,我可以通過使用指針增量ARR迭代?如果是這樣,這種行爲保存與結構和類而不是int?

+4

物理內存可以從分散的頁面分配,但分配的內存的虛擬地址空間將是連續的。 – rcgldr

+0

@ DOUGLASO.MOEN:對我來說這些天來說是一件愚蠢的事情,但我無法抗拒:自從C++ 03以來,'std :: vector'連續性纔得到保證。 – Bathsheba

回答

11

C++標準絕對保證這一點。

arr[0]arr[9]是連續的,元素之間不允許填充。指針運算在分配的區域內有效。您可以設置指向arr + 10的指針,但是不需要解除引用。

這適用於任何類。每個元素分配的內存量爲sizeof(Y),其中Y是類或普通舊數據類型。

+0

您將在結構/類的末尾獲得填充以獲得正確的對齊。但sizeof將包含填充,所以是的,數組將是連續的。 – Sergei

+0

@ DOUGLASO.MOEN你如何建議用'sizeof()'檢測填充的存在? –

+0

sizeof(YourClass)vs sizeof(每個數據成員)的總和 – Sergei

2

是的元素被保證位於連續記憶(獨立於他們的類型)。當你調用new[]時,你會得到一個數組,實際上訪問元素的唯一方法是通過指針算術。

考慮一下arr[i]實際上意味着:

arr[i] 

真是

*((arr) + (i)) 

的這種古怪的sideeffect只是一個縮寫形式,是一個數組arr和索引i

i[arr] 

與完全相同(儘管如果你想混淆你的同事,你只會寫這個)。

但是請注意,[]可能會被重載,在這種情況下,它可以執行任何實現選擇。儘管如此,分配有new[]的數組也具有超載的oeprator[]將在連續的存儲器中具有其元素。

+1

從我的答案中借用文本沒有什麼壞處 - 如果有多個答案,那麼最好的方法是最好的。 – Bathsheba

+0

另外,如果你專注於'[]'表示法,你可能想指出它可能被重載。 – Bathsheba

+0

Ty爲漂亮的筆記。我只是試圖提出一個簡單的問題,而沒有實際的實施 –