2014-09-18 34 views
1

我明白,增強入侵集合最終存儲對象的引用,因此對象需要他們自己的生命週期管理。我可以使用boost池作爲存儲來支持增強入侵集合嗎?

我想知道我是否可以簡單地使用boost池來管理這個生命週期。當我想在一個新的對象列表中存儲一個新的對象時,我是否可以從boost池中分配一個對象並將其存儲在列表中?然後,當我從列表中刪除,然後我使用boost池釋放。

回答

1

答案是肯定的。

這也不是很典型。

如果你想控制其中內存分配,你使用一個池。

如果要解耦數據結構的內存佈局及其語義,請使用侵入式容器。

所以,有一個甜蜜點,但它看起來更像是:

  • 裝飾元素類型與侵入掛鉤(例如,用於侵入地圖)
  • 您創建某種類型的「最佳新元素「內存佈局(這很可能是一個vector<MyElement, custom_allocator>

寬鬆的言論:

  • 然後當我從列表中刪除,然後我解除分配使用boost池

    使用池一個典型的場景是明確當你想/不/有解除分配要素(謹防不平凡的破壞者)。否則,你只需動動手堆當地池的低效率(碎片),上鎖

  • 對象需要有自己的生命週期管理

    這聽起來稍微偏離。事實上,客體不需要有「他們自己的」終身管理。只是它們的生命不是,它們是由它們參與的侵入式數據結構控制的。

    例如,通過將所有元素存儲在一個向量中,您可以獲得連續的存儲空間,並且所有元素的生命週期都由矢量[1]控制。因此可以從容器語義


[1]周圍矢量再分配任何問題通常通過保留足夠的能力預先防止分離元件壽命和分配。如果你這樣做,你會意識到這與固定大小的池分配器非常相似,但具有零碎片的額外保證。如果你不需要後者,你可以做一個list<T, pool_allocator<T> >,這樣你就可以獲得參考的位置,但可以在插入/刪除時獲得穩定的參考。等等

+0

我認爲boost :: pool可以優於vector,因爲它在分配和釋放節點時隱式地處理內存。 – 2014-09-19 13:24:27

+0

@NathanDoromal在這方面與vector,deque有什麼區別? – sehe 2014-09-19 15:22:38

+0

不同之處在於,我們碰到了vector或deque的末尾,需要分配更多的節點。隱式地都使用分配器,並且都使用額外的動態內存,除非使用自定義分配器,否則本身不會被追蹤。通過使用Boost池,我擺脫了這種額外的管理,並且一氣呵成地處理了生命週期管理和動態內存管理。 – 2014-09-19 18:44:30

相關問題