簡體   English   中英

STL Vector默認使用'new'和'delete'進行內存分配嗎?

[英]Does STL Vector use 'new' and 'delete' for memory allocation by default?

我正在為應用程序創建一個插件,其中應該由應用程序分配內存並跟蹤它。 因此,應該以緩沖區的形式從宿主應用程序獲取內存句柄,然后將它們返回給應用程序。 現在,我正計划使用STL Vectors,我想知道它在內部使用什么樣的內存分配。

它是否在內部使用“新”和“刪除”功能? 如果是這樣,我可以用自己的函數重載'new'和'delete'嗎? 或者我應該創建自己的模板分配器,這對我來說看起來很困難,因為我沒有創建自定義模板的經驗。

歡迎任何建議/示例代碼。 可以從這樣的應用程序中獲取內存句柄

void* bufferH = NULL;

bufferH = MemReg()->New_Mem_Handle(size_of_buffer);
MemReg()->Dispose_Mem_Handle(bufferH); //Dispose it

vector默認使用std::allocator ,並且std::allocator需要使用全局運算符new(即::operator new(size_t) )來獲取內存(20.4.1.1)。 但是,每次調用allocator::allocate都不需要調用它一次。

所以,是的,如果你替換全局運算符new,那么vector將使用它,雖然不一定真正允許你的實現“高效”地管理內存。 原則上,你想要使用的任何特殊技巧都可以通過std::allocator以10MB塊和子std::allocator獲取內存而完全無關。

如果您有一個特定的實現,您可以查看其vector行為,如果您的計划分配策略本質上是特定於平台的,那么這可能就足夠了。

STL容器使用在構造時給出的分配器默認分配器使用operator newoperator delete

如果您發現默認值不適合您,則可以提供符合容器要求的自定義分配器。 這里引用一些現實世界的例子。

我會首先使用默認值測量性能,並且僅在您確實需要時進行優化。 分配器抽象為您提供了一種相對簡潔的微調方式,無需重新設計。 如何使用vector可能會比底層分配器( reserve()更多的性能影響,避免在元素范圍的中間插入和刪除,有效地處理元素的復制構造 - 標准警告

std::vector使用unitialized_*函數從原始內存構造其元素(使用placement new)。 它使用創建的任何分配器來分配存儲,並且默認情況下,分配器直接使用::operator new(size_t)::operator delete(void *p) (即,不是特定於類型的operator new )。

這篇文章中,“分配器的概念最初是為了提供不同內存模型的抽象來處理在某些16位操作系統上具有不同指針類型的問題(例如近,遠等等)”。 。

“該標准提供了一個內部使用全局運算符'new'和'delete'的分配器”

作者還指出了alocator界面並不那么可怕。 正如Neil Buchanan所說,“親自嘗試吧!”

實際的std::allocator已針對相當大的大小對象進行了優化。 分配許多小物體並不是最好的,對許多大型物體來說也不是最好的。 話雖如此,它也不是為多線程應用程序編寫的。

我可以建議,在嘗試編寫自己的之前,如果你要使用多線程路由,請查看Hoard分配器。 (或者您也可以查看同樣吸引人的英特爾TBB頁面。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM