インテル® C++ コンパイラー XE 13.1 ユーザー・リファレンス・ガイド

C/C++ の呼び出し規約

引数が関数へ渡される方法や関数から値が返される方法について規則を規定する多くの呼び出し規約があります。

Windows* の呼び出し規約

次の表は、Windows* でサポートされている呼び出し規約をまとめたものです。

呼び出し規約

コンパイラー・オプション

説明

__cdecl

/Gd

C/C++ プログラムのデフォルトの呼び出し規約。変数引数を使用する関数で指定できます。

__clrcall

なし

関数がマネージドコードからのみ呼び出されるように指定する呼び出し規約です。

__stdcall

/Gz

Win32 API 関数に使用される標準呼び出し規約です。

__fastcall

/Gr

引数がスタックではなく、レジスターで渡されるように指定する高速な呼び出し規約です。

__regcall

/Qregcall。宣言で別の呼び出し規約が指定されない限り、コンパイル時に __regcall が関数のデフォルトの呼び出し規約であることを指定します。

インテル® コンパイラーの呼び出し規約で、レジスターでできる限り多くの引数を渡せるように指定します。同様に、__regcall は値を返す際、可能な限りレジスターを使用します。 この呼び出し規約は、変数引数を使用する関数で指定された場合は無視されます。

__thiscall

なし

変数引数を使用しない C++ メンバー関数により使用されるデフォルトの呼び出し規約です。

Linux* と OS X* の呼び出し規約

次の表は、Linux* と OS X* でサポートされている呼び出し規約をまとめたものです。

呼び出し規約

コンパイラー・オプション

説明

__attribute((cdecl))

なし

C/C++ プログラムのデフォルトの呼び出し規約。変数引数を使用する関数で指定できます。

__attribute((stdcall))

なし

引数がスタックで渡されるように指定する呼び出し規約です。変数引数を使用する関数では指定できません。

__attribute((regparm (number)))

なし

IA-32 アーキテクチャー・ベースのシステムでは regparm 属性により、コンパイラーは最大 number で指定される個数の引数をスタックではなく、EAX、EDX、ECX レジスターで渡します。 可変長引数をとる関数は、引き続きスタック上ですべての引数を渡します。

__attribute__((regcall))

-regcall。宣言で別の呼び出し規約が指定されない限り、コンパイル時に __regcall が関数のデフォルトの呼び出し規約であることを指定します。

インテル® コンパイラーの呼び出し規約で、レジスターでできる限り多くの引数を渡せるように指定します。同様に、__regcall は値を返す際、可能な限りレジスターを使用します。 この呼び出し規約は、変数引数を使用する関数で指定された場合は無視されます。

__regcall 呼び出し規則

__regcall 呼び出し規約はインテル® コンパイラー特有のものです。次の点に注意してください。

__regcall を使用するには、関数の宣言の前にキーワードを配置してください。次に例を示します。

__regcall int foo (int i, int j);

__attribute__((regcall)) foo (int I, int j); (Linux* および OS X* のみ)

利用可能な __regcall レジスター

__regcall function の すべてのレジスターは、コンパイラーにより予約されているレジスターを除き、パラメーターの引渡し/値の返しに使用できます。 次の表は、コンパイルのデフォルト ABI に応じた各レジスタークラスで利用可能なレジスターです。レジスターは表にリストされた順番で使用されます。

レジスタークラス/アーキテクチャー

IA-32 アーキテクチャー

インテル® 64 アーキテクチャー

GPR (注 1 を参照)

EAX、ECX、EDX、EDI、ESI

RAX、RCX、RDX、RDI、RSI、R8 - R15

FP

ST0

ST0

MMX

なし

なし

XMM

XMM0 - XMM7

XMM0 - XMM15

YMM

YMM0 - YMM7

YMM0 - YMM15

注 1: インテル® 64 アーキテクチャー・ベースの Windows* システムでは、R13 は引数渡しや値の返しには使用されません。予約済みとして扱う必要があります。

__regcall データ型の分類

__regcall のパラメーターや戻り値はデータ型に基づいて分類され、次の表にあるように、そのクラスのレジスターで渡されます。

型 (符号なし/符号付きの両方の型)

IA-32 アーキテクチャー

インテル® 64 アーキテクチャー

bool、char、int、enum、_Decimal32、long、pointer

GPR

GPR

short、__mmask

GPR

GPR

long long、__int64

注 3 を参照してください。また、「構造データ型の分類規則」も参照してください。

GPR

_Decimal64

XMM

GPR

long double

FP

FP

float、double、float128、_Decimal128

XMM

XMM

__m128、__m128i、__m128d

XMM

XMM

__m256、__m256i、__m256d

YMM

YMM

__m512

n/a

n/a

complex type、struct、union

「構造データ型の分類規則」を参照してください。

「構造データ型の分類規則」を参照してください。

注 2: 構造化型のため、GPR クラスの分類が使用されています。

注 3: IA-32 アーキテクチャー・ベースのシステムでは、これらの 64 ビット整数型 (long long, __int64) は、2 つの 32 ビットの整数フィールドの構造で実装されているかのように、GPR クラスに分類され、2 個のレジスターで渡されます。

関連クラスのレジスターよりもレジスターのサイズが小さい型は、下位のレジスターで渡されます。例えば、float は XMM レジスターの下位 4 バイトで渡されます。

__regcall 構造データ型の分類規則

構造体/共用体および複素数型は、次の例外を除いて x86_64 ABI と同じように分類されます。

レジスターまたはスタックへの __regcall の配置

「データ型の分類」「構造データ型の分類規則」で説明されている分類の後、__regcall パラメーターと戻り値は利用可能なレジスターで指定されたレジスターに配置されるか、または次の説明に従ってメモリーに配置されます。

値を保持する __regcall レジスター

次のレジスターは、パラメーター渡しや値の戻しで使用されない限り、__regcall 呼び出し間でその値を保持します。

レジスタークラス/ABI

IA-32 アーキテクチャー

インテル® 64 アーキテクチャー

GPR

ESI、EDI、EBX、EBP、ESP

R10 - R15、RBX、RBP、RSP

FP

なし

なし

MMX

なし

なし

XMM

XMM4 - XMM7

XMM8 - XMM15

YMM

XMM4 - XMM7

XMM8 - XMM15

その他のレジスターでは、この呼び出しで値は保持されません。

__regcall の修飾

__regcall とともに使用される関数名には修飾子が付きます。 特に、従来のマングル化が発生する前に __regcall__ が先頭に追加されます。 例えば、foo 関数は、__regcall__foo のように修飾子が付きます。 これにより、異なる呼び出し規約に従う名前に不適切にリンクされないようにすると同時に、foo で行えるあらゆる操作 (デバッガーへのブレークポイントの設定など) を行うことができます。


このヘルプトピックについてのフィードバックを送信