2016-07-31 119 views

回答

3

連續new表達式不一定分配連續的內存塊。

但是C++ 14具有用於new表達式,其中,在一定條件下它們可以與單個new表達(即不一定分配足夠大的塊的連續內存)代替這樣的序列的特殊支持,並且其中相應的delete表達式被替換爲單個delete表達式。

C++ 14(N3936草案)§5.3.4/ 10:

實現是允許省略一個呼叫到一個可更換的全球分配函數(18.6.1.1,18.6.1.2 )。當它這樣做時,存儲由實現提供,或者通過擴展另一個new表達式的分配來提供。實現可擴展的new -expression e1配置提供了new -expression e2存儲,如果以下情況是真實的被分配不延長:
- 的e1評價是e2評估之前測序,並
- e2評價每當e1獲得存儲,並
- 既e1e2調用相同的可更換的全球分配的功能,並
- 如果通過e1e2調用分配函數是投擲,任何抗辯在任e1e2將首先被夾在相同的處理程序,並
評價拋出NS - 通過e1產生的指針值和e2是操作數來評價delete -expressions,並
- 的e2評價之前測序delete表達式的評估 - 其操作數是由e1生成的指針值。

0

內存管理是真的取決於操作系統 - 在運行時,這等同於調用C malloc功能幾次連續的,即相鄰的分配,不能保證(雖然可能)。爲了保證對象存儲在連續的內存塊中,它們應該保存在一個數組中。

我不確定你想要的是什麼應用程序,但是在大多數情況下,從緩存友好性提高速度遠遠超過傳遞物體的開銷。緩存友好性只會加速在大型數據庫上運行的程序(例如,長陣列的合併),因爲CPU不需要快速將數組緩存到緩存中和緩存中 - 但是,對於少量的對象,不必擔心緩存,因爲它的影響會非常小。如果你是單獨聲明每個向量,而不是數組中的塊,我猜測它們並不是那麼多,因此不需要將它們放入數組中,並且不會加速程序。

0

在大多數實現中,分配器會保存以前的free'd內存,您不會指望總是獲得連續的內存。

想想這種情況:Test1是一個大對象,Test2是小的一個,Test3是一箇中等大小。

當你爲Test1分配時,當前內存池沒有足夠大的可重用內存,所以它請求擴展堆並從那裏分配。 然後你爲小Test2做,這只是一個微小的對象,有從以前free'd一個可重複使用的內存,所以你從該池中獲得Test2

對於Test3其類似於Test2,但對於性能分配器將保持不同尺寸範圍內的多個池,因此Test3Test2後可能不會去。

注意:所有這些在規範中都不是強制性的,它取決於實現,這裏提出的只是通常的實現之一(進一步閱讀:Buddy內存分配)。