それを考慮して:
Microsoft固有
__fastcall呼び出し規約は、可能な場合、関数への引数がレジスターで渡されることを指定します。次のリストは、この呼び出し規約の実装を示しています。
また、レジスタの読み取り/書き込み時間はスタックよりもはるかに高速ですが、C#に同等の__fastcallはありますか?
それを考慮して:
Microsoft固有
__fastcall呼び出し規約は、可能な場合、関数への引数がレジスターで渡されることを指定します。次のリストは、この呼び出し規約の実装を示しています。
また、レジスタの読み取り/書き込み時間はスタックよりもはるかに高速ですが、C#に同等の__fastcallはありますか?
直接ではありませんが、C# はほとんどの場合、MSVC++ の __stdcall 規則と同等のものを使用します。ただし、比較的汚れた方法ではありますが、「修正」することはできます(例は __cdecl 用であることに注意してください)。
この方法が一番いいのかもしれませんが。C# のような高水準言語 (ほとんどの C++ プログラムでさえ) では、これはコンパイラーに任せるのが最適な最適化です。強制的な呼び出し規則は、事態を悪化させることがよくあります。そして、それが役立つ場合でも、少なくとも私が使用した C および C++ プログラムでは、通常はあまり役に立ちません。
__fastcall は自動的に使用されますが、特定の条件でのみ使用されます。このテーマに関する興味深い記事は次のとおりです。
2. メソッド内のパラメーターは 7 つまでです。
その背後にある理由は、.net では最初の 2 つのパラメーターが最後の 2 つのパラメーターよりも高速であるためです。より明確に説明しましょう。C# では、メソッドが呼び出されるたびにパラメーターがスタックにプッシュされ、メソッドによって使用されます。現在、Microsoft のコンパイラ (X86) には、__FASTCALL と呼ばれる高度な最適化手法があり、最初の 2 つのパラメーターはレジスターとして送信されます。これらは現在、登録されていると言われています。登録後、変数またはパラメーターは、プロセッサの最速のキャッシュに格納されるという排他的な特権を持つ高速トラック昇格を持ちます。これは通常、ループまたは反復中に使用する変数「i」に対して行われることに注意してください。これにより、アクセスと使用が実際に非常に高速になります。したがって、
LadaRaider の 32 ビット Arch では、「最大のレジスタの最大サイズは 4 バイトです」という意味です。8 バイトの「Long Long」を渡すと、4 バイトのレジスタが 2 つ使用されます。これがコンパイラの処理方法です。たとえば、4 バイトのレジスタを 3 つしか使用できないとします。たとえば、2 つの「Long Long」変数を渡すことはできません。一部のデータはメモリに格納する必要があり、これははるかに低速です。