C / C ++関数呼び出しプロトコルの概要

__stdcallは、__ CDECLと3つの機能が合意に__fastcall呼び出している、契約は関数呼び出しスタックモード機能パラメータに影響を与えるだろうが、ルールの関数名コンパイラを変更し、スタックデータの中の道をクリアします。1.通話プロトコル一般的に使用されるアプリケーションは__stdcall:Windows API関数は、デフォルトのプロトコルを呼び出します。__cdecl:C / C ++関数は、デフォルトのプロトコルを呼び出します。__fastcall:機会の高いパフォーマンス要件に適しています。2.関数のパラメータは、モードスタック__stdcallを:右から左に関数のパラメータを描きます。__cdecl:右から左に関数のパラメータを描きます。__fastcall:ECXとCPUのEDXレジスタ、右から左に描画残りのパラメータに左バイトパラメータから4以上ではありません。一つの問題:__レジスタの4バイト、高いパフォーマンスを必要とするアプリケーションにそれほど高い性能より大きくないパラメータにfastcall。3. [スタックデータで道__stdcall:呼び出された関数によるデータ内の関数呼び出しのクリーンアップスタックした後。__cdecl:関数呼び出し側によるデータ内の関数呼び出しのクリーンアップスタックした後。__fastcall:呼び出された関数によるデータのクリーンアップスタック内の関数呼び出しの後。一つの問題:コンパイラのスタック構造の異なるセットは、スタックデータ内の関数の呼び出し元でクリアクロスプラットフォームを開発することは現実的ではないとき、同じではありません。質問2:特定の機能のパラメータは、printf関数として、この関数は、関数の呼び出し元によってデータ・スタック内でクリアすることができ、可変です。質問3:呼び出し側によるデータ内のクリーンアップスタック、各呼び出しは、クリーンアップスタックデータ内のコードなので、大きな実行可能ファイルが含まれています。4.C言語コンパイラ関数名マングリング規則は__stdcall:コンパイル後、関数名は「_functionnameの@番号」に変更されます。





















__cdecl:コンパイル後、関数名は「_functionname」に変更されます。
__fastcall:コンパイル後、関数名は「@ functionnameと@ nmuber」に変更されます。
注意:関数名、「番号」パラメータとして「functionnameとは、」バイト数です。
注:別のプロトコルを使用して、関数呼び出しの機能の実装と機能を定義する場合は、関数呼び出しを実現することはできません。ルールをマングリング5.C ++コンパイラ関数名は__stdcall:コンパイル後、関数名は、に変更され、「functionnameと@@ YG ****** @ Z? 」。__cdecl:コンパイル後、関数名は、に変更され、 "functionnameと@@ YA ****** @ Z? "。__fastcall:コンパイル後、関数名がに変更され、 "functionnameと@@ YI ****** @ Z? "。注意:「******」関数が値テーブルとパラメータの型を返します。注:別のプロトコルを使用して、関数呼び出しの機能の実装と機能を定義する場合は、関数呼び出しを実現することはできません。C言語やC ++言語でない場合は特別な処理の間に、それぞれの関数を呼び出す達成することはできません。







おすすめ

転載: www.cnblogs.com/ivan06/p/11328727.html
おすすめ