参照(ポインタ)だから関数呼び出しが早い?

「参照(ポインタ)渡しをすると、アドレスが渡されるので早いんだよ」
それを聞いたAさんは以下のような足し算をする関数を書きました。

int add(const int& a, const int& b);

int add(int a, int b)だった時と比べて、どうなったでしょうか?

1.変わらない 2.早くなる 3.遅くなる

コレを間違えるならば、貴方はC言語の初心者です。

# intをCPUが最も処理しやすいと仮定します


答えは3です。参照を使うと遅くなります。ポインタも同様です。1と答えた方は、何もしらないか、相当ひねくれている(謎)かのどちらかでしょう。少なくともPentium(x86)では遅くなる、他のCPUでは、同等になることがあっても、早くなることはないです。

遅くなる理由は、関数の値であるaやbを直接コピー(値渡し)したほうが早いからです。つまりアドレスから実際の値をたぐり寄せる分が無駄になるのです。(Pentiumではメモリの内容を直接加算することが出来ないからmov(メモリコピー)命令が2つ増えます)

つまり、こう教えるべきだったのです。

「参照(ポインタ)渡しをするのは、値渡しでコピーするにはデータが大きすぎる時である。」

と。

ココまで書いて、偉そうにブログに書く話じゃないと少し後悔していますが、初学の足しになれば幸いです。ちなみに、とある人のコードでintのconst参照渡しを見て思い出したわけで、決してネタ不足なわけじゃありません。

# ネタは常時募集中。

Leave a Reply

最初のコメントを頂けますか?

更新通知を受け取る »
avatar
wpDiscuz