Bagikan melalui


__fastcall

Khusus Microsoft

Konvensi __fastcall panggilan menentukan bahwa argumen ke fungsi akan diteruskan dalam register, jika memungkinkan. Konvensi panggilan ini hanya berlaku untuk arsitektur x86. Daftar berikut menunjukkan implementasi konvensi panggilan ini.

Elemen implementasi
Urutan pengoperasian argumen Dua DWORD argumen pertama atau lebih kecil yang ditemukan dalam daftar argumen dari kiri ke kanan diteruskan dalam register ECX dan EDX; semua argumen lainnya diteruskan pada tumpukan dari kanan ke kiri.
Tanggung jawab pemeliharaan tumpukan Fungsi yang disebut memunculkan argumen dari tumpukan.
Konvensi dekorasi nama Tanda (@) diawali dengan nama; tanda dilanjutkan dengan jumlah byte (dalam desimal) dalam daftar parameter dicukupkan ke nama.
Konvensi terjemahan kasus Tidak ada terjemahan kasus yang dilakukan.
Kelas, struktur, dan serikat Diperlakukan sebagai jenis "multibyte" (terlepas dari ukuran) dan diteruskan pada tumpukan.
Kelas enum dan enum Diteruskan dengan mendaftar jika jenis yang mendasarnya diteruskan melalui daftar. Misalnya, jika jenis yang mendasar adalah int atau unsigned int ukuran 8, 16, atau 32 bit.

Catatan

Versi kompilator di masa mendatang dapat menggunakan register yang berbeda untuk menyimpan parameter.

Menggunakan opsi pengkompilasi /Gr menyebabkan setiap fungsi dalam modul dikompilasi sebagai __fastcall kecuali fungsi dideklarasikan dengan menggunakan atribut yang bertentangan, atau nama fungsinya adalah main.

Kata __fastcall kunci diterima dan diabaikan oleh kompilator yang menargetkan arsitektur ARM dan x64; pada chip x64, berdasarkan konvensi, empat argumen pertama diteruskan dalam daftar jika memungkinkan, dan argumen tambahan diteruskan pada tumpukan. Untuk informasi selengkapnya, lihat Konvensi Panggilan x64. Pada chip ARM, hingga empat argumen bilangan bulat dan delapan argumen floating-point dapat diteruskan dalam register, dan argumen tambahan diteruskan pada tumpukan.

Untuk fungsi kelas nonstatis, jika fungsi didefinisikan secara out-of-line, pengubah konvensi panggilan tidak harus ditentukan pada definisi di luar baris. Artinya, untuk metode anggota non-statis kelas, konvensi panggilan yang ditentukan selama deklarasi diasumsikan pada titik definisi. Mengingat definisi kelas ini:

struct CMyClass {
   void __fastcall mymethod();
};

Ini:

void CMyClass::mymethod() { return; }

setara dengan ini:

void __fastcall CMyClass::mymethod() { return; }

Untuk kompatibilitas dengan versi sebelumnya, _fastcall adalah sinonim untuk __fastcall kecuali opsi pengompilasi /Za (Nonaktifkan ekstensi bahasa) ditentukan.

Contoh

Dalam contoh berikut, fungsi DeleteAggrWrapper diteruskan argumen dalam register:

// Example of the __fastcall keyword
#define FASTCALL    __fastcall

void FASTCALL DeleteAggrWrapper(void* pWrapper);
// Example of the __ fastcall keyword on function pointer
typedef BOOL (__fastcall *funcname_ptr)(void * arg1, const char * arg2, DWORD flags, ...);

END Khusus Microsoft

Baca juga

Konvensi Passing dan Penamaan Argumen
Kata kunci