参照型で高速化と省メモリ化

構造体やクラスなどで新しい型を作った場合。
特殊な技法を使わない場合に無駄にコピーされ時間やメモリが使われることがあります。


そんな例を以下に示します。

#include <iostream>
using namespace std;

struct Vect { int x,y,z; };

void printVect(Vect vect)
{
    cout << vect.x << endl;
    cout << vect.y << endl;
    cout << vect.z << endl;
}

int main()
{
    Vect vect;
    vect.x = 10;
    vect.y = 20;
    vect.z = 30;
    printVect(vect);
    return 0;
}


printVectの関数内ではvectの値を出力するだけなのですが
引数で渡すときに新しいvectが生成されてしまいます。


コピーが必要な場合は無駄ではありませんが、この例では無駄です。
そんな時に役に立つのが参照やポインタです。
(参照が使われることが多いです。C言語は使えないのでアドレス固定にconst使うといいかも)

#include <iostream>
using namespace std;

struct Vect { int x,y,z; };

void printVect(Vect &vect)
{
    cout << vect.x << endl;
    cout << vect.y << endl;
    cout << vect.z << endl;
}

int main()
{
    Vect vect;
    vect.x = 10;
    vect.y = 20;
    vect.z = 30;
    printVect(vect);
    return 0;
}


同じように出力できたと思います。


注意する点は以下の「&」の部分です。

void printVect(Vect &vect)

他の部分はまったく同じです。


これは参照と呼ばれる技法です。
参照には別名(エイリアス)を使います。

int a = 10;
int& b = a;
cout << a << endl; // 10
cout << b << endl; // 10
b = 20;
cout << a << endl; // 20
cout << b << endl; // 20


変数(a)に対して別名(b)を名づけます。
この時別名(b)が変更された場合元の変数(a)も変更されます。
*別名は設定すると他の変数の別名に変更することはできません。
*const Vect* のようなものですね。(!= const Vect* const)


上記のprintVect(Vect& vect)を呼び出す時に、Vect& vectという変数を生成します。
通常のprintVect(Vect vect)ではVect型のコピーが行われますが
別名のprintVect(Vect& vect)ではVect&型を生成して代入するだけです。


このようにエイリアスを用いて参照で関数を実装することによって
高速化や省メモリ化を目指すことが可能です。