我聽說std :: vector很好,因爲它保證連續分配內存(緩存友好)。那麼像這樣的順序「新」運營商呢?連續的'新'操作符是否連續分配內存?
{
new Test1();
new Test2();
new Test3();
}
它不會使堆上的連續分配內存?
我聽說std :: vector很好,因爲它保證連續分配內存(緩存友好)。那麼像這樣的順序「新」運營商呢?連續的'新'操作符是否連續分配內存?
{
new Test1();
new Test2();
new Test3();
}
它不會使堆上的連續分配內存?
連續new
表達式不一定分配連續的內存塊。
但是C++ 14具有用於new
表達式,其中,在一定條件下它們可以與單個new
表達(即不一定分配足夠大的塊的連續內存)代替這樣的序列的特殊支持,並且其中相應的delete
表達式被替換爲單個delete
表達式。
」實現是允許省略一個呼叫到一個可更換的全球分配函數(18.6.1.1,18.6.1.2 )。當它這樣做時,存儲由實現提供,或者通過擴展另一個
new
表達式的分配來提供。實現可擴展的new
-expressione1
配置提供了new
-expressione2
存儲,如果以下情況是真實的被分配不延長:
- 的e1
評價是e2
評估之前測序,並
-e2
評價每當e1
獲得存儲,並
- 既e1
和e2
調用相同的可更換的全球分配的功能,並
- 如果通過e1
和e2
調用分配函數是投擲,任何抗辯在任e1
或e2
將首先被夾在相同的處理程序,並
評價拋出NS - 通過e1
產生的指針值和e2
是操作數來評價delete
-expressions,並
- 的e2
評價之前測序delete
表達式的評估 - 其操作數是由e1
生成的指針值。
內存管理是真的取決於操作系統 - 在運行時,這等同於調用C malloc
功能幾次連續的,即相鄰的分配,不能保證(雖然可能)。爲了保證對象存儲在連續的內存塊中,它們應該保存在一個數組中。
我不確定你想要的是什麼應用程序,但是在大多數情況下,從緩存友好性提高速度遠遠超過傳遞物體的開銷。緩存友好性只會加速在大型數據庫上運行的程序(例如,長陣列的合併),因爲CPU不需要快速將數組緩存到緩存中和緩存中 - 但是,對於少量的對象,不必擔心緩存,因爲它的影響會非常小。如果你是單獨聲明每個向量,而不是數組中的塊,我猜測它們並不是那麼多,因此不需要將它們放入數組中,並且不會加速程序。
在大多數實現中,分配器會保存以前的free'd內存,您不會指望總是獲得連續的內存。
想想這種情況:Test1
是一個大對象,Test2
是小的一個,Test3
是一箇中等大小。
當你爲Test1
分配時,當前內存池沒有足夠大的可重用內存,所以它請求擴展堆並從那裏分配。 然後你爲小Test2
做,這只是一個微小的對象,有從以前free'd一個可重複使用的內存,所以你從該池中獲得Test2
。
對於Test3
其類似於Test2
,但對於性能分配器將保持不同尺寸範圍內的多個池,因此Test3
Test2
後可能不會去。
注意:所有這些在規範中都不是強制性的,它取決於實現,這裏提出的只是通常的實現之一(進一步閱讀:Buddy內存分配)。