簡體   English   中英

是否存在不會隱式釋放內存的STL分配器?

[英]Is there an STL Allocator that will not implicitly free memory?

我的STL容器中的內存使用量預計會不穩定 - 也就是說它會經常收縮和增長。 我想通過為STL容器類型聲明指定一個分配器來解決這個問題。 我知道池分配器是為了處理這種情況,但我擔心的是波動率將超過池的帳戶,為了克服它,我必須進行大量測試以確定良好的池指標。

我的理想分配器永遠不會隱式釋放內存 ,事實上,如果內存只是在分配器被破壞后才被釋放,那么它是完全可以接受的。 顯式釋放未使用的內存的成員函數會很好,但不是必需的。 我知道我所指的聽起來像是一個每個對象的分配器,這違反了標准。 我寧願堅持標准,但如果我不能在其中解決這個問題,我會放棄它。

我不太關心初始性能,而是更關注平均性能。 換句話說,一次分配單個元素或它們的池是否重要,更重要的是所述分配是否導致調用new / malloc。 我編寫自己的分配器沒有問題,但是有沒有人知道預先存在的分配器能夠完成嗎? 如果它有所不同,這將是連續的內存容器(例如vector,deque),盡管通用的解決方案會很好。

我希望這不是太基礎。

內存將被分配並釋放更多用於添加項目而不是刪除它們。

我相信除非您知道應用程序允許的最大元素數,否則永遠不會“釋放”內存。 CRT可能會嘗試分配更大的內存塊,但您如何處理故障情況呢?

闡釋:

要創建動態擴展向量,將有更大的容量來處理大多數push_backs,並在不足時處理重新分配。

  • 在重新分配期間,新的更大的內存被“新”起來,舊的內存的元素被復制到新的內存中。
  • 在push_back元素中不要持有任何迭代器是很重要的,因為重新分配會使內存無效
    迭代器指向的位置。

  • 在c ++ 11和TR1中,您可能有完美的轉發,只需要復制指向元素的指針。 這是通過移動構造函數而不是復制構造函數完成的。

但是,您似乎希望盡可能避免重新分配。

使用向量的默認分配器,您可以指定初始容量。

  • 容量是分配的內存,大小是元素的數量。

  • 內存僅在構造時分配,如果大小達到容量。 這應該只發生在push_back();

  • 默認分配器將容量增加一倍(例如1.5,2.0),以便重新分配在線性時間內進行。 因此,如果你有一個循環推回數據它是線性的。 或者,如果您提前知道元素的數量,則可以分配一次。

您可以探索游泳池概念。 游泳池的想法是你不是破壞元素,而是停用它們。

如果您仍想編寫自己的分配器,這是一篇很好的文章。

自定義分配器

暫無
暫無

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

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