関数の引数のコスト

parameter-overhead.png

最も覚えておくべき重要なポイントは、

大きなオブジェクトを値で渡してはいけない

ということです。じゃあ参照やポインタならいいってことかな?

ここでいう「大きなオブジェクト」とは作成時に数バイト以上の割り当てを必要とするオブジェクトのことです。
プラットフォームにもよりますが、最新のハードウェアを使用している場合、
参照またはポインタは大体32ビットです。
なので、32ビットより大きなクラスは値で渡したら無駄です。

このようなオブジェクトを関数の引数に値で渡すと、オブジェクトの一時的なコピーが作成されます。
これが非常にコストのかかることになります。メモリ的に一時的に膨れ上がったり、時間もかかります。
なので

関数の引数は、参照かポインタにしましょう!

もっというと、関数の引数が、入力値だった場合はconst 参照
出力値だった場合はポインタにするのが通例です。

引数の数が多い場合は?

渡してる引数は全部32ビット以下の、intとかfloatなんだけど、32ビット以下だから何個増やしてもいいよね!!??
いいえ、引数の数も、多すぎるのはよくありません。
なぜかというと、

未使用のレジスタを使い切るまでに入れられるパラメータの数に限度があるから

です。
もし、関数の引数の数が多すぎて、入りきらなくなったら、
残りはスタックに入れられます
つまり、パラメータをスタックメモリにコピーし、必要な時に呼び出された関数から取得します。
スタックは頻繁に使用されるためにデータキャッシュに置かれます。
まぁ、あんまり引数の数がパフォーマンスの大きな阻害になることはありません。
しかし、人間にとって引数の数が多いことが阻害になります。

引数の数が5個~7個超えたら、考え直すべき

です。人間が一度に把握できる物事の数はそんなに多くありません。

どうやって引数の数を減らす?

  • 一部のデータをクラスや構造体にする

パフォーマンスも多少向上するのでやらない手はありません


argument

サポートサイト Wikidot.com argument