C 中多次 new 的位址為什麼不是連續的?

時間 2021-06-01 01:46:30

1樓:沒什麼技術

因為C++的new其實也是呼叫malloc,而malloc底層原理採用的是記憶體池結構,和STL的第二層配置器類似,將記憶體池分為從一系列大小的記憶體chunk,最小16b,然後兩個規格的記憶體chunk相差8。相同的chunk由鍊錶串起來,形成一條鍊錶~所以你兩次分配的記憶體都分配了16b的記憶體chunk~這是我的一點見解~

2樓:Pluto Hades

首先,這不是C++的設計,預設記憶體分配主要取決於作業系統

其次,如果你說的Cache是指CPU的Cache,那麼實際上你這種情況就算不連續,CPU的流水線和預取技術完全能保證命中率

最後,真有對效率如此看重的演算法,都是預分配一整塊連續記憶體然後內部管理的,你看谷歌就有個malloc和new的實現叫做TCMalloc,還挺好用的

3樓:crazybie

這個不是CPP的設計,new預設是向作業系統申請記憶體,所以具體細節依賴OS。

一般來說,記憶體不連續原因有幾點:

1 debug模式下為了記憶體診斷加入了額外的消耗2 碎片過多的時候無法找到連續位址的記憶體

關於cache你的理解是對的。但是讓底層系統保證cache友好是不可靠的,大部分時候你需要自己管理。

當然自動管理的例子比如有compact的gc的語言會按需要移動記憶體,效果如何就很難說了,畢竟你不能控制它何時移動。

4樓:丁冬

所以STL可以自定義記憶體分配器。

事實上operator new費心費力給你找一整塊記憶體的過程本身就有開銷,你又不能保證後續的好處一定是使用者會利用到的。

唯一能滿足各種不同需求的方式就是不要多事。

補充一下,C++裡你可以找到std::allocator乙個簽名如下的成員:

pointer

allocate

(size_typen,

std::

allocator

>::

const_pointer

hint=0

);hint如果不為空,在實現支援的情況下分配的記憶體會盡可能接近hint指向的位置。

c 中new是如何動態的分配記憶體的?int p p new int 5 5不是在寫程式的時候自己填的麼?這怎麼叫動態分配?

1 在 Stack 上分配的,因為函式返回前要修正回去,所以必須是 編譯期 確定大小。棧是從高位址向低位址延伸,申請空間就是棧頂指標減操作,函式返回加回去,即被清理掉。2 在 Heap 上分配的,系統會管理您分配的內容,不受函式返回的限制,位址是從低往高延伸。假設您要分配的記憶體是 執行期 動態決策...

在C 中怎麼獲取new開闢的二維動態陣列的行數和列數?

exiledkingcc 動態二維陣列可以使用vector 或者自己簡單封裝一下。比如 class Mat col,data int operator size t r,size t c constreturn date r col cint operator size t r,size t cre...

C 中的 this 為什麼是指標而不是引用?

中二青年 這個是c 作者的個人主頁,可以看一下答案,裡面還回答了,為什麼引入ref的原因。Why is this not a reference?Because this was introduced into C really into C with Classes before referenc...