はじめに
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++を効率よく使いこなすために、ぜひ参照を活用してください!