Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Kesan kaedah lulus parameter fungsi C++ pada prestasi program

Kesan kaedah lulus parameter fungsi C++ pada prestasi program

WBOY
WBOYasal
2024-04-12 21:51:021169semak imbas

Dalam C++, parameter fungsi boleh dihantar mengikut nilai (membuat salinan untuk dihantar ke fungsi) atau dengan rujukan (melepasi alamat pembolehubah asal). Melepasi nilai adalah selamat tetapi mahal dan sesuai untuk parameter kecil atau apabila pembolehubah asal perlu dilindungi. Hantaran rujukan adalah pantas tetapi mempunyai fleksibiliti yang rendah dan sesuai untuk objek besar atau situasi di mana pembolehubah asal perlu diubah suai. Eksperimen menunjukkan bahawa apabila berurusan dengan tatasusunan yang besar, lulus melalui rujukan dengan ketara meningkatkan prestasi daripada lulus dengan nilai.

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

Impak kaedah lulus parameter fungsi C++ pada prestasi program

Dalam C++, parameter fungsi boleh diluluskan mengikut nilai atau rujukan. Untuk jenis parameter yang berbeza, adalah penting untuk memilih kaedah penyampaian yang sesuai kerana ia akan menjejaskan prestasi program dengan ketara.

Pass by value

In pass by value, salinan parameter fungsi dihantar ke fungsi. Menukar salinan tidak menjejaskan nilai pembolehubah asal. Walaupun lulus mengikut nilai memberikan keselamatan yang lebih besar, terdapat overhed apabila menghantar objek besar kerana parameter perlu dibuat dan disalin. Contoh kod berikut menunjukkan lulus mengikut nilai:

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

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

Lulus melalui rujukan

Secara lulus dengan rujukan, rujukan kepada parameter fungsi dihantar kepada fungsi. Ini bermakna bahawa fungsi menerima alamat pembolehubah asal. Perubahan yang dibuat pada rujukan akan secara langsung mempengaruhi nilai pembolehubah asal. Rujukan pass-by menghapuskan overhed passing by value kerana ia tidak memerlukan parameter penyalinan, tetapi ia mengorbankan fleksibiliti kerana pengubahsuaian pembolehubah yang ditunjukkan oleh rujukan tidak dibenarkan. Contoh kod berikut menunjukkan lulus melalui rujukan:

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

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

Kaedah hantaran terpilih

Memilih kaedah hantaran terbaik bergantung pada situasi:

  • Melepasi nilai: Apabila pembolehubah asal perlu dilindungi daripada pengubahsuaian fungsi, atau Apabila hujah adalah nilai kecil.
  • Lulus dengan rujukan: Apabila parameter ialah objek besar atau apabila fungsi perlu mengubah suai pembolehubah asal.

Kes Praktikal

Dalam contoh berikut, kami membandingkan prestasi atur cara dalam kes menghantar tatasusunan sebagai nilai dan rujukan kepada fungsi:

#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;
}

Semasa melaksanakan program ini, kami melihat bahawa menggunakan rujukan lulus dengan Prestasi meningkat dengan ketara kerana tatasusunan besar tidak perlu disalin.

Atas ialah kandungan terperinci Kesan kaedah lulus parameter fungsi C++ pada prestasi program. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn