[解決済み] C++でnewの代わりにstd::allocatorを使う利点は何ですか?
質問
私は今、以下の記事を読みました。
std::allocator
. 私の意見では、これを使うのは
new
と
delete
.
とは
allocator
では、明示的にヒープメモリを確保し、それを構築し、破壊し、そして最後にメモリを解放しなければなりません。では、なぜそれが作られたのでしょうか?
どのような場合に使用でき、どのような場合に new や delete の代わりに使用する必要があるのでしょうか?
どのように解決するのですか?
std::allocator
は標準ライブラリコンテナのデフォルトのメモリアロケータであり、独自のアロケータを代用することができます。これにより、標準コンテナがどのようにメモリを割り当てるかを制御することができます。しかし、ご質問の件は
std::allocator
を使うのではなく、メモリを確保して、そのメモリにオブジェクトを構築するという戦略です。
new T[N]
を使うのではありません。
で、その理由は
new T[N]
ではどのコンストラクタが呼び出されるかを制御することができないからです。そして、すべてのオブジェクトを同時に構築することを強制されるのです。これは、例えば、目的に対してひどいものです。
std::vector
のような、たまにしか割り当てたくないような用途では最悪です。
生のメモリアロケータを使用すると、容量を決定する一定量のメモリーを割り当てることができます。そして、ユーザーが(好きなコンストラクタを使って)ベクタにアイテムを追加すると、このメモリにその場でオブジェクトを構築することができます。
そして、メモリが足りなくなったら、さらに、通常は 2 倍のメモリを割り当てます。もし
std::vector
使用される
new T[N]
を使用した場合、要素を追加したり削除したりするたびに再割り当てをしなければならず、パフォーマンスが低下します。また、すべてのオブジェクトにデフォルトのコンストラクタを使わざるを得なくなり、オブジェクトの種類に不必要な制限がかかることになります。
std::vector
が保持できるオブジェクトの種類に不必要な制限を加えることになります。
関連
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】浮動小数点数の乱数生成
-
[解決済み】'std::cout'への未定義の参照
-
[解決済み] using namespace std;」はなぜバッドプラクティスだと言われるのですか?
-
[解決済み】画像処理。コカ・コーラ缶」認識のためのアルゴリズム改良
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】C++17の新機能は何ですか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】C++でnewキーワードはいつ使うべきですか?
-
[解決済み】NULL終端文字列の根拠は何ですか?
最新
-
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++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++ 式はポインタからオブジェクトへの型を持っている必要があります。
-
[解決済み】変数 '' を抽象型 '' と宣言できない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】fpermissiveフラグは何をするのですか?
-
[解決済み】「std::operator」で「operator<<」にマッチするものがない。
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み] カスタムC++アロケータの説得力のある例?