[解決済み] polymorphic_allocator: いつ、なぜそれを使うべきか?
質問
これ に関するドキュメントです。 cppreference , こちら はワーキングドラフトです。
の本当の目的は何なのか、正直言ってよく分かりませんでした。
polymorphic_allocator
とか、いつ、なぜ、どのように使うべきかということです。
例として
pmr::vector
には次のような署名があります。
namespace pmr {
template <class T>
using vector = std::vector<T, polymorphic_allocator<T>>;
}
は何を意味しているのでしょうか?
polymorphic_allocator
を提供するか?このように
std::pmr::vector
に関しても、同様に提供します。
std::vector
?
今までできなかったことが、今できること?
そのアロケーターの本当の目的は何なのか、実際いつ使うべきなのか?
どのように解決するのですか?
cppreferenceからの選択引用です。
<ブロッククオートこの実行時ポリモーフィズムにより、polymorphic_allocator を使用するオブジェクトは、同一の静的アロケータ型にもかかわらず、実行時に異なるアロケータ型を使用したかのように振る舞うことができます。
通常のアロケーターの問題は、コンテナの型が変わってしまうことです。もしあなたが
vector
を特定のアロケータで使用する場合、そのアロケータを使用した
Allocator
テンプレート・パラメータを使用します。
auto my_vector = std::vector<int,my_allocator>();
ここで問題なのは、このベクトルがアロケータが異なるベクトルと同じ型ではないことです。例えば、デフォルトアロケータベクタを必要とする関数に渡すことはできませんし、アロケータタイプの異なる2つのベクタを同じ変数/ポインタに代入することもできません(例:
auto my_vector = std::vector<int,my_allocator>();
auto my_vector2 = std::vector<int,other_allocator>();
auto vec = my_vector; // ok
vec = my_vector2; // error
ポリモーフィックアロケータとは、テンプレート機構ではなく、動的ディスパッチによってアロケータの振る舞いを定義できるメンバーを持つ単一のアロケータタイプのことです。これによって、共通の型でありながら、特定のカスタマイズされたアロケーションを使用するコンテナを持つことができます。
アロケータの動作のカスタマイズは、アロケータに
std::memory_resource *
:
// define allocation behaviour via a custom "memory_resource"
class my_memory_resource : public std::pmr::memory_resource { ... };
my_memory_resource mem_res;
auto my_vector = std::pmr::vector<int>(0, &mem_res);
// define a second memory resource
class other_memory_resource : public std::pmr::memory_resource { ... };
other_memory_resource mem_res_other;
auto my_other_vector = std::pmr::vector<int>(0, &mes_res_other);
auto vec = my_vector; // type is std::pmr::vector<int>
vec = my_other_vector; // this is ok -
// my_vector and my_other_vector have same type
私が考えるに、残された主な問題は
std::pmr::
コンテナは、まだ同等の
std::
コンテナをデフォルトのアロケータで使用します。コンテナで動作するインターフェイスを設計するときに、いくつかの決定をする必要があります。
- 渡されたコンテナがカスタムアロケーションを必要とする可能性があるか?
- もしそうなら、(任意のアロケーターを許容するために)テンプレート・パラメーターを追加すべきでしょうか、それともポリモーフィック・アロケーターの使用を義務付けるべきでしょうか?
テンプレートソリューションでは
任意の
アロケータはポリモーフィックアロケータを含むが、他の欠点がある(生成されるコードのサイズ、コンパイル時間、コードをヘッダーファイルで公開しなければならない、さらなる型汚染の可能性、問題を外部に押し出すことになる)。一方、ポリモーフィックアロケータの解決策では、ポリモーフィックアロケータが
は
が使われます。このため
std::
コンテナはデフォルトのアロケータを使用し、レガシーコードとのインターフェイスに影響を与えるかもしれません。
通常のアロケータと比較すると、ポリモーフィック・アロケータには、memory_resource ポインタのストレージ・オーバーヘッド(これはおそらく無視できるものです)や、割り当てのための仮想関数ディスパッチのコストなど、いくつかの小さなコストが発生します。主な問題は、ポリモーフィックアロケータを使わないレガシーコードとの互換性の欠如でしょう。
関連
-
[解決済み】1つ以上の多重定義されたシンボルが見つかる
-
[解決済み】標準ライブラリにstd::endlに相当するタブはあるか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++でint型に無限大を設定する
-
[解決済み】LLVMで暗黙のうちに削除されたコピーコンストラクタの呼び出し
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】C++ - 適切なデフォルトコンストラクタがない [重複]。
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み】Visual Studioのデバッガーエラー。プログラムを開始できません 指定されたファイルが見つかりません
-
[解決済み】デバッグアサーションに失敗しました
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない