コンテナの移動は、要素のコピーを回避し、要素の所有権を直接転送するため、コピーよりも高速です。大きなコンテナの場合、コンテナを移動するとパフォーマンスが大幅に向上します。
C++ コンテナ ライブラリでのコンテナのコピーと移動のパフォーマンス比較
C++ では、コンテナのコピーと移動は、コンテナの内容をコピーするために使用される 2 つの操作です。コードを最適化するには、この 2 つの違いとパフォーマンスの違いを理解することが重要です。
コンテナのコピー
コンテナのコピーでは、元のコンテナ内のすべての要素のコピーを含むコンテナの新しいコピーが作成されます。この操作には各要素のディープ コピーの実行が含まれますが、これは時間のかかるプロセスになる可能性があります。
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2(vec1); // 拷贝 vec1
コンテナの移動
コンテナの移動は、コピーを作成するのではなく、元のコンテナの内容を新しいコンテナに「移動」します。これは、コピーを実行せずに要素の所有権をあるコンテナから別のコンテナに直接転送するため、より軽量な操作です。
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = std::move(vec1); // 移动 vec1
パフォーマンスの比較
コンテナのコピーのパフォーマンスのオーバーヘッドは、移動の場合よりも高くなります。これは、後者が要素のコピー手順を回避するためです。大きなコンテナの場合、コンテナを移動するとパフォーマンスが大幅に向上します。
次のコードは、異なる要素サイズでの異なるコンテナ タイプのコピー時間と移動時間の比較を示しています:
#include <ctime> #include <vector> #include <list> int main() { const int iterations = 100000; for (int size = 10000; size <= 100000; size += 10000) { // 创建容器 std::vector<int> vec(size); std::list<int> list(size); // 记录拷贝时间 std::clock_t start = std::clock(); for (int i = 0; i < iterations; i++) { std::vector<int> vecCopy(vec); } std::clock_t end = std::clock(); std::cout << "Vector copy: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl; start = std::clock(); for (int i = 0; i < iterations; i++) { std::list<int> listCopy(list); } end = std::clock(); std::cout << "List copy: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl; // 记录移动时间 start = std::clock(); for (int i = 0; i < iterations; i++) { std::vector<int> vecMove(std::move(vec)); } end = std::clock(); std::cout << "Vector move: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl; start = std::clock(); for (int i = 0; i < iterations; i++) { std::list<int> listMove(std::move(list)); } end = std::clock(); std::cout << "List move: " << (double)(end - start) / CLOCKS_PER_SEC << "s" << std::endl << std::endl; } return 0; }
出力 (例、実際の結果はシステムによって異なる場合があります):
Vector copy: 0.052s List copy: 0.009s Vector move: 0.014s List move: 0.003s ... Vector copy: 0.542s List copy: 0.058s Vector move: 0.082s List move: 0.013s
出力が示すように、すべての要素のサイズ、コンテナの移動は、コンテナのコピーよりもはるかに高速です。
結論
大きなコンテナの場合、元のコンテナが必要ない場合、コンテナをコピーするための最初の選択肢はコンテナを移動することです。コンテナーのコピーと移動の違いを理解することで、情報に基づいた意思決定を行い、コードのパフォーマンスを最適化できます。
以上がC++ コンテナ ライブラリでのコンテナのコピーと移動のパフォーマンスの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。