1. ホーム
  2. c++

[解決済み] C++でnewの代わりにstd::allocatorを使う利点は何ですか?

2023-05-18 17:35:45

質問

私は今、以下の記事を読みました。 std::allocator . 私の意見では、これを使うのは newdelete .

とは allocator では、明示的にヒープメモリを確保し、それを構築し、破壊し、そして最後にメモリを解放しなければなりません。では、なぜそれが作られたのでしょうか?

どのような場合に使用でき、どのような場合に new や delete の代わりに使用する必要があるのでしょうか?

どのように解決するのですか?

std::allocator は標準ライブラリコンテナのデフォルトのメモリアロケータであり、独自のアロケータを代用することができます。これにより、標準コンテナがどのようにメモリを割り当てるかを制御することができます。しかし、ご質問の件は std::allocator を使うのではなく、メモリを確保して、そのメモリにオブジェクトを構築するという戦略です。 new T[N] を使うのではありません。

で、その理由は new T[N] ではどのコンストラクタが呼び出されるかを制御することができないからです。そして、すべてのオブジェクトを同時に構築することを強制されるのです。これは、例えば、目的に対してひどいものです。 std::vector のような、たまにしか割り当てたくないような用途では最悪です。

生のメモリアロケータを使用すると、容量を決定する一定量のメモリーを割り当てることができます。そして、ユーザーが(好きなコンストラクタを使って)ベクタにアイテムを追加すると、このメモリにその場でオブジェクトを構築することができます。

そして、メモリが足りなくなったら、さらに、通常は 2 倍のメモリを割り当てます。もし std::vector 使用される new T[N] を使用した場合、要素を追加したり削除したりするたびに再割り当てをしなければならず、パフォーマンスが低下します。また、すべてのオブジェクトにデフォルトのコンストラクタを使わざるを得なくなり、オブジェクトの種類に不必要な制限がかかることになります。 std::vector が保持できるオブジェクトの種類に不必要な制限を加えることになります。