Le mouvement du conteneur est plus rapide que la copie, car le mouvement évite la copie des éléments et transfère directement la propriété des éléments. Pour les grands conteneurs, le déplacement du conteneur peut améliorer considérablement les performances.
Comparaison des performances de copie et de déplacement de conteneur dans la bibliothèque de conteneurs C++
En C++, la copie et le déplacement de conteneur sont deux opérations utilisées pour copier le contenu d'un conteneur. Comprendre les différences et les différences de performances entre les deux est essentiel pour optimiser votre code.
Copie d'un conteneur
La copie d'un conteneur crée une nouvelle copie du conteneur qui contient une copie de tous les éléments du conteneur d'origine. Cette opération implique d’effectuer une copie complète de chaque élément, ce qui peut prendre du temps.
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2(vec1); // 拷贝 vec1
Déplacement des conteneurs
Le conteneur déplace "déplace" le contenu du conteneur d'origine dans le nouveau conteneur plutôt que de créer une copie. Il s'agit d'une opération plus légère car elle transfère directement la propriété des éléments d'un conteneur à un autre sans effectuer de copie.
std::vector<int> vec1 = {1, 2, 3}; std::vector<int> vec2 = std::move(vec1); // 移动 vec1
Comparaison des performances
La surcharge de performances de la copie de conteneur est supérieure à celle du déplacement car ce dernier évite l'étape de copie d'élément. Pour les grands conteneurs, le déplacement du conteneur peut améliorer considérablement les performances.
Le code suivant montre une comparaison des temps de copie et de déplacement pour différents types de conteneurs et différentes tailles d'éléments :
#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; }
Output (par exemple, les résultats réels peuvent varier d'un système à l'autre) :
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
Comme le montre la sortie, pour pour toute la taille des éléments, le déplacement de conteneurs est beaucoup plus rapide que la copie de conteneurs.
Conclusion
Pour les grands conteneurs, déplacer le conteneur est le premier choix pour copier le conteneur lorsque le conteneur d'origine n'est pas nécessaire. En comprenant la différence entre la copie et le déplacement de conteneurs, vous pouvez prendre des décisions éclairées et optimiser les performances de votre code.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!