参照の基本と参照渡しを活用する方法

c++
スポンサーリンク

はじめに

C++の「参照」は、変数を効率的に扱うために非常に便利な機能です。本記事では、参照の基本的な使い方から、関数への参照渡し、パフォーマンス向上のためのテクニックまでを解説します。

参照とは?

参照(Reference)は、既存の変数に別名をつける仕組みです。ポインタと異なり、NULL(ヌル)を指すことがなく、より直感的に扱うことができます。

参照の宣言と使用方法

#include <iostream>
using namespace std;

int main() { int a = 3; int &b = a; // bは変数aの参照

cout << "a: " << a << endl; // aの値を出力(3) cout << "b: " << b << endl; // bの参照先の値を出力(3)

b = 4; // 参照先の値を変更(aが4になる)

cout << "a: " << a << endl; // aの値を出力(4) cout << "b: " << b << endl; // bの参照先の値を出力(4) }

参照の特徴

  • & 記号を用いて参照を定義する。
  • 参照を通じて値を変更すると、元の変数も変更される。
  • 一度参照を定義すると、別の変数を参照することはできない。
  • 関数への参照渡し

    参照渡しとは?

    関数の引数を参照として受け取ることで、コピーを作成せずに値を変更することができます。

    int g(int &x) {
      x = x * 2;  // xの参照先(呼び出し元の変数)が変更される
      return x;
    }
    int main() {
      int a = 3;
      int b = g(a);  // xの参照先がaになる
      cout << "a: " << a << endl;  // a: 6
      cout << "b: " << b << endl;  // b: 6
    }

    参照渡しのメリット

  • 不要なコピーを防ぐ → パフォーマンス向上
  • 関数で複数の値を返す
  • 関数で複数の値を返す

    参照を使うことで、関数の戻り値とは別に複数の値を返すことができます。

    #include <iostream>
    using namespace std;
    

    void min_and_max(int a, int b, int c, int &minimum, int &maximum) { minimum = min(a, min(b, c)); maximum = max(a, max(b, c)); }

    int main() { int minimum, maximum; min_and_max(3, 1, 5, minimum, maximum); cout << "minimum: " << minimum << endl; // 1 cout << "maximum: " << maximum << endl; // 5 }

    参照を使ったパフォーマンス改善

    関数の引数を参照渡しにすることで、不要なコピーを減らし、処理速度を大幅に向上できます。

    参照を使わない場合(時間がかかる)

    #include <vector>
    using namespace std;
    

    int sum100(vector<int> a) { // 配列をコピー int result = 0; for (int i = 0; i < 100; i++) { result += a.at(i); } return result; }

    int main() { vector<int> vec(10000000, 1); for (int i = 0; i < 500; i++) { cout << sum100(vec) << endl; // 毎回コピーが発生(遅い) } }

    この場合、vec が毎回コピーされるため、処理時間が 7813 ms ほどかかります。

    参照を使った場合(高速)

    int sum100(const vector<int> &a) {  // 参照渡し(コピーなし)
      int result = 0;
      for (int i = 0; i < 100; i++) {
        result += a.at(i);
      }
      return result;
    }

    これにより、処理時間が 15 ms まで短縮されます。大量のデータを扱う場合、参照渡しを活用することで大幅なパフォーマンス改善が可能です。

    まとめ

  • 参照は変数の別名を作成する機能
  • 関数の引数を参照にすると、値のコピーを防げる
  • 複数の値を関数から返す際に便利
  • 参照渡しを使うとパフォーマンスが向上する
  • C++を効率よく使いこなすために、ぜひ参照を活用してください!

    タイトルとURLをコピーしました