Maison  >  Article  >  développement back-end  >  L'impact des méthodes de transmission des paramètres de fonction C++ sur les performances du programme

L'impact des méthodes de transmission des paramètres de fonction C++ sur les performances du programme

WBOY
WBOYoriginal
2024-04-12 21:51:021169parcourir

En C++, les paramètres de fonction peuvent être passés par valeur (créant une copie à transmettre à la fonction) ou par référence (en passant l'adresse de la variable d'origine). Le passage par valeur est sûr mais coûteux et convient aux petits paramètres ou lorsque la variable d'origine doit être protégée. Le passage de référence est rapide mais a une faible flexibilité et convient aux objets volumineux ou aux situations où la variable d'origine doit être modifiée. Les expériences montrent que lorsqu'il s'agit de grands tableaux, le passage par référence améliore considérablement les performances que le passage par valeur.

C++ 函数参数传递方式对程序性能的影响

L'impact de la méthode de transmission des paramètres de fonction C++ sur les performances du programme

En C++, les paramètres de fonction peuvent être transmis par valeur ou par référence. Pour différents types de paramètres, il est crucial de choisir la méthode de livraison appropriée car elle affectera considérablement les performances du programme.

Pass by value

En pass by value, une copie des paramètres de la fonction est transmise à la fonction. La modification de la copie n'affecte pas la valeur de la variable d'origine. Bien que le passage par valeur offre une plus grande sécurité, il y a une surcharge lors du passage d'objets volumineux car les paramètres doivent être créés et copiés. L'exemple de code suivant illustre le passage par valeur :

void foo(int num) {
  num++;  // 值传递副本,不会影响原始变量
}

int main() {
  int x = 5;
  foo(x);
  cout << x << endl; // 输出5,没有改变
}

Pass par référence

Dans le passage par référence, une référence à un paramètre de fonction est transmise à la fonction. Cela signifie que la fonction reçoit l'adresse de la variable d'origine. Les modifications apportées à la référence affecteront directement la valeur de la variable d'origine. Le passage par référence élimine la surcharge liée au passage par valeur car il ne nécessite pas de copie de paramètres, mais il sacrifie la flexibilité car la modification de la variable pointée par la référence n'est pas autorisée. L'exemple de code suivant illustre le passage par référence :

void foo(int& num) {
  num++;  // 引用传递引用,更改原始变量
}

int main() {
  int x = 5;
  foo(x);
  cout << x << endl; // 输出6,已改变
}

Méthode de passage sélective

Le choix de la meilleure méthode de passage dépend de la situation :

  • Passage par valeur : Lorsque la variable d'origine doit être protégée contre la modification par un fonction, ou lorsque l'argument est une petite valeur.
  • Pass par référence : Lorsque le paramètre est un gros objet ou lorsque la fonction doit modifier la variable d'origine.

Cas pratique

Dans l'exemple suivant, nous comparons les performances du programme en cas de passage d'un tableau comme valeur et référence à la fonction :

#include <chrono>
#include <vector>

int sum_array_by_value(const std::vector<int>& arr) {
  int sum = 0;
  for (int i : arr) {
    sum += i;
  }
  return sum;
}

int sum_array_by_reference(std::vector<int>& arr) {
  int sum = 0;
  for (int& i : arr) {
    sum += i;
  }
  return sum;
}

int main() {
  std::vector<int> arr(1000000);
  for (int i = 0; i < arr.size(); i++) arr[i] = i;

  auto start = std::chrono::high_resolution_clock::now();
  int sum1 = sum_array_by_value(arr);
  auto end = std::chrono::high_resolution_clock::now();
  int elapsed1 = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

  start = std::chrono::high_resolution_clock::now();
  int sum2 = sum_array_by_reference(arr);
  end = std::chrono::high_resolution_clock::now();
  int elapsed2 = std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();

  std::cout << "Sum by value: " << elapsed1 << " ms" << std::endl;
  std::cout << "Sum by reference: " << elapsed2 << " ms" << std::endl;

  return 0;
}

Lors de l'exécution de ce programme, nous observons qu'en utilisant le passage par référence, les performances sont significativement améliorées puisque les grands tableaux n'ont pas besoin d'être copiés.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn