2016-09-30 1 views
17

C++ 17は、メモリの割り当てと割り当て解除のためのクリーンなインターフェイスである​​を持ってきます。 Allocatorのコンセプトとは異なり、はちょうどです。 std::pmr::polymorphic_allocatorもあります。これは、メモリリソースを古典的なアロケータにラップして、既存のコンテナで使用できるようにします。新しいC++コードは、アロケータの代わりにメモリリソースを使用すべきですか?

C++ 17以降を対象とした新しいコンテナ(または他のメモリが欲しい)タイプを書くつもりなら、アロケータコンセプトに対してプログラミングを続けるか、より新しい抽象的な抽象概念を直接使用する必要がありますか?

今のところ私の考えはこのようになります。

理由はアロケータを使用して続行します:

  • それは標準ライブラリや既存のコードと一致しています。新しいstd::pmr::*のコンテナエイリアスでも、引き続きアロケータが使用されます。
  • メモリリソースはstd::pmr::polymorphic_allocatorにラップすることができるため、アロケータインターフェイスはより一般的であり、より多くのクライアントのニーズを満たします。
  • メモリリソースは常に実行時の多態性を使用するため、アロケータが提供できるゼロオーバーヘッド抽象化と比較して、わずかな追加ランタイムオーバヘッドがあります。
  • 誰かが実際に純粋なメモリリソースでは提供できないアロケータインターフェイスの他の部分(カスタムポインタ型など)を必要とするかもしれません。

理由アロケータの代わりにメモリ資源の使用を開始する:

  • アロケータインタフェースは不格好と実装が困難です。 std::pmr::memory_resourceインターフェイスはクリーンで簡単です。
  • メモリリソースはポリモーフィックであるため、コンテナのタイプには影響しません。つまり、より少ないテンプレートインスタンシエーション(高速なコンパイルとより小さな実行可能ファイル)を意味し、より多くのコードを別の翻訳単位に移動させることができます。
  • オブジェクトがメモリリソースを使用する場合、メモリリソースをstd::pmr::polymorphic_allocatorにラップすることによって、アロケータを使用するサブオブジェクトを常にインスタンス化できます。もう一方の方法は難しいです。
  • メモリ割り当ては、とにかく比較的仕事が集中する作業です。単一の仮想関数呼び出しでは、相対的に言えば、オーバーヘッドはあまりありません。

新しいライブラリ機能を効果的に使用するための推奨事項はありますか?

+1

アロケータインターフェイスは、実装するのが難しいものすべてではありません。 C++ 11はそれをもっと簡単にしました。 2つの型名、2つの関数、2つの比較のようなものが必要です。 –

+1

メモリ割り当てが「比較的仕事が集中する」かどうかは、アロケータによって異なりますか?ローカルスタック上の単調なアリーナから割り当てた場合、それは非常に高価ではないかもしれません。 –

+0

@KerrekSBそれは本当です。実際には、私はC++ 11で提供されているアダプタなしで実装したことはありません。それでも、私はエレガントなものとは思えません。 – 5gon12eder

答えて

8

この時点では、

現在、C++のアロケータは以前よりずっと簡単です。

これらは、pmrと古典的なアロケータのサポートの両方を提供します。

さらに重要なのは、pmrベースの割り当ては長年にわたって多用されていないことです。どんな弱点も依然として浮かび上がるかもしれません。

ファストプールベースのアロケータ、または固定バッファの1つまたはsbo拡張機能であっても、仮想化オーバーヘッドに気付くことがあります。

+2

私は一般的に同意するこの答えをありがとう。しかし、私は、他の人が他のことを言う場合に備えて、答えを受け入れる前に数日待つことが好きです。 "PMR" = "多態性メモリリソース"と "SBO" = "小さなバッファの最適化"と、私は信じています。 – 5gon12eder

関連する問題