const の参照
( →_→)アクセス!
今度は const
と参照を組み合わせてみよう。
int value = 0;
int const &ref = value;
// いろいろしてみる
int read = ref; // OK、読み込める
ref = 2; // NG、書き込めない
このように、const
な変数への参照 という扱いになる。
他の変数から値を読み取るだけ の場合に、コピーを防ぐときに使う感じ。
#include <string>
std::string add_quote(std::string const& message) {
return "「" + message + "」"; // ここでは複製される
}
std::string add_quote_copy(std::string message) { // ここで複製されて
return "「" + message + "」"; // 更にここで複製される
}
#include <iostream>
int main() {
std::string text = "abc";
{
std::string quote_text = add_quote(text); // text は複製されない
std::cout << quote_text << "\n";
}
{
std::string quote_text = add_quote_copy(text); // text は複製される
std::cout << quote_text << "\n";
}
}
この例は一回しかコピーが起こらないので大した違いはないけど、
大量のデータを扱い始めると問題が顕現してくる。
ただし、int
みたいな小さいサイズのを const&
で渡してもあんまり美味しくない。
- 参照型のサイズ (大抵
unsigned long
と同じ) より大きいサイズのもの - 複製する必要がないのにコピーすると遅いもの
とかにはよく効く。