Share via


__fastcall

Sezione specifica Microsoft

La __fastcall convenzione di chiamata specifica che gli argomenti delle funzioni devono essere passati nei registri, quando possibile. Questa convenzione di chiamata si applica solo all'architettura x86. Nell'elenco seguente viene illustrata l'implementazione di questa convenzione di chiamata.

Elemento Implementazione
Ordine in cui gli argomenti vengono passati I primi due DWORD o più argomenti più piccoli trovati nell'elenco di argomenti da sinistra a destra vengono passati nei registri ECX ed EDX. Tutti gli altri argomenti vengono passati nello stack da destra a sinistra.
Responsabilità di manutenzione dello stack La funzione chiamata estrae gli argomenti dallo stack.
Convenzione della decorazione dei nomi Al simbolo (@) è preceduto dai nomi; un segno in corrispondenza del segno seguito dal numero di byte (in decimale) nell'elenco di parametri viene suffisso ai nomi.
Convenzione della conversione maiuscolo/minuscolo e viceversa Non viene effettuata alcuna conversione maiuscole/minuscole.
Classi, struct e unioni Considerati come tipi "multibyte" (indipendentemente dalle dimensioni) e passati nello stack.
Enumerazioni ed enumerazioni Passato da register se il tipo sottostante viene passato da register. Ad esempio, se il tipo sottostante è int o unsigned int di dimensioni pari a 8, 16 o 32 bit.

Nota

Nelle versioni future del compilatore è possibile che vengano utilizzati registri differenti per archiviare i parametri.

L'uso dell'opzione del compilatore /Gr fa sì che ogni funzione nel modulo venga compilata come __fastcall a meno che la funzione non venga dichiarata usando un attributo in conflitto o il nome della funzione sia main.

La __fastcall parola chiave viene accettata e ignorata dai compilatori destinati alle architetture ARM e x64. In un chip x64, per convenzione, i primi quattro argomenti vengono passati nei registri quando possibile e vengono passati argomenti aggiuntivi nello stack. Per altre informazioni, vedere Convenzione di chiamata x64. In un chip ARM possono essere passati fino a quattro argomenti Integer e otto argomenti a virgola mobile nei registri e argomenti aggiuntivi vengono passati nello stack.

Per le funzioni di classe non statiche, se la funzione è definita out-of-line, il modificatore della convenzione di chiamata non deve essere specificato nella definizione out-of-line. Questo significa che per i metodi membri non statici della classe la convenzione di chiamata specificata durante la dichiarazione è presunta in corrispondenza della definizione. Data la definizione di classe seguente

struct CMyClass {
   void __fastcall mymethod();
};

il codice seguente

void CMyClass::mymethod() { return; }

equivale a questo

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

Per la compatibilità con le versioni precedenti, _fastcall è un sinonimo di __fastcall a meno che non sia specificata l'opzione del compilatore /Za (Disabilita estensioni del linguaggio).

Esempio

Nell'esempio seguente alla funzione DeleteAggrWrapper vengono passati argomenti nei registri:

// 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, ...);

Fine sezione specifica Microsoft

Vedi anche

Passaggio di argomenti e convenzioni di denominazione
Parole chiave