ホームページ >バックエンド開発 >C++ >C++ 関数パラメーター受け渡しメソッドがプログラムのパフォーマンスに与える影響

C++ 関数パラメーター受け渡しメソッドがプログラムのパフォーマンスに与える影響

WBOY
WBOYオリジナル
2024-04-12 21:51:021179ブラウズ

C では、関数パラメータは値によって (関数に渡すコピーを作成する)、または参照によって (元の変数のアドレスを渡す) 渡すことができます。値による受け渡しは安全ですがコストが高く、小さなパラメーターや元の変数を保護する必要がある場合に適しています。参照の受け渡しは高速ですが柔軟性が低く、大きなオブジェクトや元の変数を変更する必要がある状況に適しています。実験によると、大きな配列を扱う場合、参照渡しの方が値渡しよりもパフォーマンスが大幅に向上します。

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

C 関数パラメータの受け渡し方法がプログラムのパフォーマンスに及ぼす影響

C では、関数パラメータは値または値によって渡すことができます。参照 2 つの方法で提供されます。パラメータの種類が異なると、プログラムのパフォーマンスに大きな影響を与えるため、適切な配信方法を選択することが重要です。

値渡し

値渡しでは、関数パラメータのコピーが関数に渡されます。コピーを変更しても、元の変数の値には影響しません。値による受け渡しはより安全ですが、大きなオブジェクトを渡す場合はパラメーターを作成してコピーする必要があるため、オーバーヘッドが発生します。次のコード例は、値渡しを示しています。

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

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

参照渡し

参照渡しでは、関数パラメーターへの参照が渡されます。機能に。これは、関数が元の変数のアドレスを受け取ることを意味します。参照に加えられた変更は、元の変数の値に直接影響します。参照渡しでは、パラメーターをコピーする必要がないため、値渡しのオーバーヘッドがなくなりますが、参照が指す変数の変更が許可されないため、柔軟性が犠牲になります。次のコード例は、参照による受け渡しを示しています。

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

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

選択的な受け渡し方法

状況に応じて最適な受け渡し方法を選択します。

  • # 値渡し: 元の変数を関数による変更から保護する必要がある場合、または引数が小さい値の場合。
  • 参照渡し: パラメータが大きなオブジェクトである場合、または関数が元の変数を変更する必要がある場合。

実践的なケース

次の例では、配列を値として渡すときと、関数への参照を渡すときのプログラムのパフォーマンスを比較します。

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

このプログラムを実行すると、大きな配列をコピーする必要がないため、参照渡しを使用するとパフォーマンスが大幅に向上することがわかります。

以上がC++ 関数パラメーター受け渡しメソッドがプログラムのパフォーマンスに与える影響の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。