__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
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per