これは、特にTCOの関数型言語で一般的です。書きやすく、追跡しやすいだけでなく、パフォーマンス上の利点があるのではないかと思っていました。構造体の変数にアクセスするのは、それらが単なる通常の引数である場合にアクセスするのと同じくらい高速ですか?この方法に短所はありますか?
3 に答える
構造体は値によって渡されるため、利点はありません。複数の引数を1つずつ渡すと、実行中のプログラムからの割り当てと同じ量の割り当てが必要になりstruct
ます。さらに、struct
パディングが原因で結果が悪化する可能性があります。
byポインターを渡した場合でも、次のレベルの呼び出しに渡す前にstruct
、の新しいインスタンスを割り当てる必要があります。struct
理論的には、複数の呼び出しで1回割り当てた構造体を再利用することである程度のメリットが得られますが、ほとんどの場合、それは問題の価値がないマイクロ最適化になります(プロファイラーが別の方法で指示しない限り)。
再帰でさえ、多くのスタック操作が含まれ、再帰関数に引数を渡すよりもパフォーマンスが低下し、さらに不規則になり、開発者に混乱を引き起こし、独自のリスクを伴います
短所:
利用可能な場合__fastcall
、再帰関数は、レジスタを介して複数の引数を渡すことにより、パフォーマンスを向上させることができます。これに使用できる汎用レジスタの数は、プラットフォームごとに異なる場合があります。追加の引数はすべてスタックを介して渡されます。
スタックでホストされる引数が、計算のために関数の最初にレジスタにロードされる可能性があります。したがって、スタックに渡されるすべての引数には、少なくとも1つのメモリアクセスが必要です。すべてを構造体にパックしてそのポインタを渡した場合、すべてのメンバーアクセスはメモリへの少なくとも1つのアクセスも生成します。ここには本当のメリットはありません
複数の引数を値で渡すと、自由に変更できます。構造体メンバーを使用すると、計算で使用する一時的なコピーを作成するか(複数の引数を渡すことを効果的に繰り返す)、コンパイラーは変更された値を構造体インスタンスが置かれている場所に書き戻します。これにより、不要なオーバーヘッドが発生する可能性があります。
長所:
出力型の引数を構造体にパックします。これにより、引数の数が減り、関数プロトタイプが考えられるようになります。これは、機能を備えたエンティティを操作するのが人間の性質であるためです。