私は32ビットの呼び出し規約の違いについて読んでいます。fastcall
対stdcall
試練です。
私が読んだところによると、2つの規則には大きな混乱があり、この混乱を避けるために64ビットが標準化されました。
私は尋ねなければなりません、なぜfastcall
選ばれたのですか?
また、fastcall
とstdcall
はwin32用語であるため、引数を渡すためにレジスタを使用する、または使用しない関数呼び出しのUNIX用語は何ですか?
x86 Calling Conventions - ウィキペディア (フリー百科事典)にリストがあります。
x86-32 での一般的な呼び出し規約はcdecl
. __attribute__((regparm(n)))
GCC は、引数がレジスターによって渡されることを示す関数属性を提供しますn
が、これは と同じではありませんfastcall
。どちらの方法でも、引数は呼び出し先で破壊可能なレジスタに渡されるため、cdecl
(for regparm
) およびstdcall
(for ) に関連する関数呼び出しに追加のコストはかかりません (また、引数用のスタック領域を追加してからクリーンアップする労力を節約できますfastcall
)。
混乱を避けるために、Windows と Linux の x86-64 呼び出し規則は、x86-32 の呼び出し規則とは異なり、互いに異なります。どちらも ではありませんが、どちらもfastcall
かなりの数のレジスタを使用して引数を渡します。