Push_back と Emplace_back: より深い分析
はじめに
push_back と emplace_back の違いC での演算は混乱の原因となることがよくあります。どちらの関数もコンテナに要素を挿入するために使用されますが、特に右辺値参照を操作する場合の動作が異なります。
Push_back について
push_back には 3 つのオーバーロードがあります。 1 つは const 値を受け取り、もう 1 つは右辺値参照を受け取り、もう 1 つは可変長の引数を受け取ります (C 11 以降)。右辺値参照のコンテキストでは、push_back(Type&& _Val) は期待どおりに動作します。つまり、コピーを作成せずに右辺値参照をコンテナに直接挿入します。
Emplace_back の出現
Microsoft Visual C (MSVC) は、一見冗長なバージョンの emplace_back を導入しました。右辺値参照: emplace_back(Type&& _Val)。このオーバーロードは、右辺値参照とともに使用した場合、push_back(Type&& _Val) と機能的に同等であるため、冗長です。
Emplace_back の真の力
真emplace_back の可能性は、その可変引数オーバーロード emplace_back(Args&&...) にあります。 Push_back とは異なり、このオーバーロードでは、転送された引数を使用してコンテナー内でオブジェクトを直接構築できます。これにより、一時オブジェクトを作成する必要がなく、不必要なコピーが行われる可能性がなくなります。
Emplace_back を使用する場合
emplace_back は、一時オブジェクトの作成に多大な費用がかかる状況で特に役立ちます。オーバーヘッド。たとえば、複雑なオブジェクトを標準マップに挿入する場合:
std::map<int, Complicated> m; int anInt = 4; double aDouble = 5.0; std::string aString = "C++"; // Avoids creating temporary objects m.emplace(4, anInt, aDouble, aString);
MSVC の部分実装
右辺値参照に非標準の emplace_back オーバーロードを導入しているにもかかわらず、MSVC は完全な可変個引数バージョンはまだ実装されていません。この背後にある理由は、当時 Visual C 10 で可変個引数テンプレートがサポートされていなかったことです。
以上がPush_back と Emplace_back: C でそれぞれをいつ使用する必要がありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。