2014-04-13 83 views
5

大中取消分配功能已經提出在C++ 1Y包括。但是我想了解它如何影響/改善當前C++ 低級別的內存管理大中解除分配功能在C內存管理++ 1Y

此提案在N3778,其中聲明以下意圖。

隨着C++ 11,程序員可以限定一個靜態成員函數操作者 刪除,需要一個尺寸參數指示對象 的大小被刪除。等效的全局操作符delete不可用。 這種遺漏有不幸的表現後果。

現代內存分配器通常在大小類別中進行分配,而對於空間效率的原因,不要在 對象附近存儲對象的大小。取消分配然後需要搜索包含該對象的大小類別 存儲。這種搜索可能很昂貴, ,特別是因爲搜索數據結構通常不在內存 緩存中。解決的辦法是許可的實施和程序員 定義全球運營商的規模的版本刪除。當尺寸版本可用時,編譯器應調用大小版本優先於未版本的 版本。

那麼從上面的段落可以看出,操作符刪除所需的大小信息可以被維護並因此被使用的程序傳遞。這將避免任何搜索的大小,而取消分配。但按我的理解,而分配,內存管理店在某種頭的大小信息(dlmalloc解釋邊界標籤法),這將釋放的同時使用。

T* p = new T(); 
// Now size information would be stored in the header 
// *(char*)(p - 0x4) = size; 
// This would be used when we delete the memory????. 
delete p; 

如果大小信息存儲在標題中,爲什麼取消分配需要搜索它? 它看起來像我缺少明顯的東西,並沒有完全理解這個概念。

此外,此功能如何可在程序在處理C中的低級存儲器管理++一起使用。希望有人能幫助我理解這些概念。

+0

*「,並且出於空間效率原因,不要將對象的大小存儲在對象附近。」*他們正在討論其他分配策略。 – dyp

回答

3

在你的報價:

[現代內存分配器]空間效率的原因,不存儲對象附近的對象的大小。

爲了添加顯式大小信息而增加每個分配的大小顯然比使用更多的內存,比如每個分配池存儲一次大小信息,或在釋放時提供信息。