C++ 17は、メモリの割り当てと割り当て解除のためのクリーンなインターフェイスであるを持ってきます。 Allocatorのコンセプトとは異なり、はちょうどです。 std::pmr::polymorphic_allocator
もあります。これは、メモリリソースを古典的なアロケータにラップして、既存のコンテナで使用できるようにします。新しいC++コードは、アロケータの代わりにメモリリソースを使用すべきですか?
C++ 17以降を対象とした新しいコンテナ(または他のメモリが欲しい)タイプを書くつもりなら、アロケータコンセプトに対してプログラミングを続けるか、より新しい抽象的な抽象概念を直接使用する必要がありますか?
今のところ私の考えはこのようになります。
理由はアロケータを使用して続行します:
- それは標準ライブラリや既存のコードと一致しています。新しい
std::pmr::*
のコンテナエイリアスでも、引き続きアロケータが使用されます。 - メモリリソースは
std::pmr::polymorphic_allocator
にラップすることができるため、アロケータインターフェイスはより一般的であり、より多くのクライアントのニーズを満たします。 - メモリリソースは常に実行時の多態性を使用するため、アロケータが提供できるゼロオーバーヘッド抽象化と比較して、わずかな追加ランタイムオーバヘッドがあります。
- 誰かが実際に純粋なメモリリソースでは提供できないアロケータインターフェイスの他の部分(カスタムポインタ型など)を必要とするかもしれません。
理由アロケータの代わりにメモリ資源の使用を開始する:
- アロケータインタフェースは不格好と実装が困難です。
std::pmr::memory_resource
インターフェイスはクリーンで簡単です。 - メモリリソースはポリモーフィックであるため、コンテナのタイプには影響しません。つまり、より少ないテンプレートインスタンシエーション(高速なコンパイルとより小さな実行可能ファイル)を意味し、より多くのコードを別の翻訳単位に移動させることができます。
- オブジェクトがメモリリソースを使用する場合、メモリリソースを
std::pmr::polymorphic_allocator
にラップすることによって、アロケータを使用するサブオブジェクトを常にインスタンス化できます。もう一方の方法は難しいです。 - メモリ割り当ては、とにかく比較的仕事が集中する作業です。単一の仮想関数呼び出しでは、相対的に言えば、オーバーヘッドはあまりありません。
新しいライブラリ機能を効果的に使用するための推奨事項はありますか?
アロケータインターフェイスは、実装するのが難しいものすべてではありません。 C++ 11はそれをもっと簡単にしました。 2つの型名、2つの関数、2つの比較のようなものが必要です。 –
メモリ割り当てが「比較的仕事が集中する」かどうかは、アロケータによって異なりますか?ローカルスタック上の単調なアリーナから割り当てた場合、それは非常に高価ではないかもしれません。 –
@KerrekSBそれは本当です。実際には、私はC++ 11で提供されているアダプタなしで実装したことはありません。それでも、私はエレガントなものとは思えません。 – 5gon12eder