現代のコンパイラは非常に巧妙なので、関数が「隠されている」(つまり、コードの生成時にコンパイラが認識できないものの一部である) 場合、まったく違いがない可能性があります。ただし、コンパイラが指示に従う場合、単純な型を参照として渡すことで大きな違いが生じる可能性があります。特に、値がコード内で何度も更新される場合。
私が働いていた場所で、次のようなコードを見ました。
void SomeClass::FindLength(int &len)
{
listEntry* list = theList; // theList is a member variable.
len = 0;
while (list)
{
len++;
list = list->next;
}
}
コードを次のように変更します。
void SomeClass::FindLength(int &len)
{
listEntry* list = theList; // theList is a member variable.
int tempLen = 0;
while (list)
{
tempLen++;
list = list->next;
}
len = tempLen;
}
コード全体が約 30% 速く実行され、多くの場所から呼び出されました (途中で if 条件があったと思うので、単に長さを追跡することはできませんでした)。また、これは API 関数の一部であるため、関数のシグネチャを変更することはできませんでした。
参照を使用すると速度が低下した理由は、メモリからレジスタへのロード、レジスタのインクリメント、およびメモリへのストア レジスタである、参照値が更新されるたびにコンパイラが参照値に書き込むためです。このtempLen
ソリューションを使用すると、コンパイラーはレジスターを使用できるようになり、はるかに高速になります。