簡體   English   中英

新的 C++ 代碼應該使用內存資源而不是分配器嗎?

[英]Should new C++ code use memory resources instead of allocators?

C++17 將為我們帶來std::pmr::memory_resource ,它是一個用於分配和釋放內存的干凈接口。 Allocator概念不同,它僅能做到這一點,此而已。 還將有std::pmr::polymorphic_allocator將內存資源包裝到經典分配器中,以便它可以與現有容器一起使用。

如果我要編寫一個針對 C++17 及更高版本的新容器(或其他內存飢餓)類型,我應該繼續針對分配器概念進行編程還是直接使用更新和更清晰的抽象?

到目前為止,我的想法是這樣的。

繼續使用分配器的原因:

  • 它與標准庫和現有代碼一致。 即使是新的std::pmr::*容器別名也繼續使用分配器。
  • 由於可以將內存資源包裝到std::pmr::polymorphic_allocator ,因此 allocator 接口更加通用,可以滿足更多客戶端的需求。
  • 內存資源始終使用運行時多態性,因此與分配器可以提供的零開銷抽象相比,它們具有較小的額外運行時開銷。
  • 也許有人實際上需要純內存資源無法提供的分配器接口的其他部分(例如自定義指針類型)。

開始使用內存資源而不是分配器的原因:

  • 分配器接口笨拙且難以實現。 std::pmr::memory_resource接口簡潔明了。
  • 由於內存資源是多態的,它們不會影響容器的類型,這意味着更少的模板實例(因此可能更快的編譯和更小的可執行文件)並使我們能夠將更多代碼移動到單獨的翻譯單元中。
  • 如果一個對象使用內存資源,它總是可以通過將內存資源包裝到std::pmr::polymorphic_allocator來實例化仍然使用分配器的子對象。 反過來就更難了。
  • 無論如何,內存分配是一項相對工作密集的任務。 相對而言,單個虛函數調用不會增加太多開銷。

是否已經存在關於如何有效使用新庫功能的任何建議?

在這一點上沒有。

C++ 中的分配器目前比以前容易得多。

它們提供 pmr(多態)和經典分配器支持。

更重要的是,基於 pmr 的分配多年來一直沒有被大量使用。 任何弱點都可能會暴露出來。

基於快速池的分配器,甚至固定緩沖區分配器或 sbo(小緩沖區優化)擴展,可能會注意到虛擬化開銷。

暫無
暫無

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

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