in
参照による受け渡しは、値による受け渡しと論理的に同等のようです。
正しい。
パフォーマンス上の利点はありますか?
はい。
物事のバックエンド側では、ref
パラメーターは少なくとも変数の物理アドレスをコピーする必要があると私は信じていました。これは、一般的なオブジェクト参照と同じサイズである必要があります。
存在しない要求オブジェクトへの参照と変数への参照の両方が同じサイズであることが、そこではない要件のいずれかが機械語のサイズであることは、しかし、はい、実際には32で32ビットであるの両方ビットマシンと64ビットマシンの64ビット。
「物理アドレス」がそれと何の関係があると思うかは私にはわかりません。Windowsでは、ユーザーモードコードの物理アドレスではなく、仮想アドレスを使用します。どのような状況で、物理アドレスがC#プログラムで意味があると思いますか?知りたいです。
また、ストレージの仮想アドレスとして、あらゆる種類の参照を実装する必要はありません。CLI仕様の準拠実装では、参照はGCテーブルへの不透明なハンドルである可能性があります。
大きな構造体だけに利点がありますか?
より大きな構造体を渡すコストを削減することが、この機能の動機付けとなるシナリオです。
in
プログラムが実際に速くなるという保証はなく、プログラムが遅くなる可能性があることに注意してください。 パフォーマンスに関するすべての質問には、実証研究によって回答する必要があります。常に勝つ最適化はほとんどありません。これは「常に勝つ」最適化ではありません。
他の場所で魅力的なものにする舞台裏のコンパイラ最適化はありますか?
コンパイラとランタイムがされている許可C#の仕様の規則に違反しないようにすれば、彼らが選択した任意の最適化を行うこと。私の知る限り、in
パラメータのそのような最適化はまだありませんが、それは将来そのような最適化を排除するものではありません。
すべてのパラメータを入力しないのはなぜですか?
さて、int
パラメータの代わりにin int
パラメータを作成したとします。どのような費用がかかりますか?
- コールサイトでは、値ではなく変数が必要になりました
- 変数を登録できません。ジッタの注意深く調整されたレジスタ割り当てスキームには、レンチが投入されました。
- 呼び出しサイトのコードは、変数への参照を取得してスタックに配置する必要があるため、より大きくなりますが、その前に、値を呼び出しスタックにプッシュするだけで済みます。
- コードが大きくなると、一部の短いジャンプ命令が長いジャンプ命令になっている可能性があるため、コードも大きくなります。これは、あらゆる種類のものにノックオン効果をもたらします。キャッシュはすぐにいっぱいになり、ジッターはより多くの作業を行う必要があり、ジッターはより大きなコードサイズで特定の最適化を行わないことを選択する場合があります。
- 呼び出し先サイトでは、スタック(またはレジスター)上の値へのアクセスをポインターへの間接参照に変えました。現在、そのポインタはキャッシュ内にある可能性が高いですが、それでも、値への1命令アクセスを2命令アクセスに変更しました。
- 等々。
でdouble
、をに変更するとしますin double
。この場合も、変数を高性能浮動小数点レジスタに登録することはできません。これはパフォーマンスに影響を与えるだけでなく、プログラムの動作を変える可能性もあります。C#は、64ビットよりも高い精度で浮動小数点演算を実行できます。通常は、浮動小数点を登録できる場合にのみ実行します。
これは無料の最適化ではありません。代替案に対するパフォーマンスを測定する必要があります。設計ガイドラインが示唆しているように、最初から大きな構造体を作成しないことが最善の策です。
ref
を渡すために使用されます。構造体を変更してはならないことを意味します。in