__fastcall

Section spécifique à Microsoft

La __fastcall convention d’appel spécifie que les arguments des fonctions doivent être transmis dans des registres, le cas échéant. Cette convention d’appel s’applique uniquement à l’architecture x86. La liste suivante illustre l'implémentation de cette convention d'appel.

Élément Implémentation
Ordre de transmission des arguments Les deux DWORD premiers arguments ou plus petits trouvés dans la liste d’arguments de gauche à droite sont passés dans les registres ECX et EDX ; tous les autres arguments sont passés sur la pile de droite à gauche.
Responsabilité de la maintenance de la pile La fonction appelée enlève les arguments de la pile.
Convention de décoration de nom Le signe (@) est préfixé aux noms ; un signe suivi du nombre d’octets (en décimal) dans la liste de paramètres est composé de noms.
Convention de conversion de casse Aucune conversion de casse n'est effectuée.
Classes, structs et unions Traité comme des types « multioctets » (quelle que soit la taille) et transmis sur la pile.
Énumérations et classes d’énumération Transmis par registre si leur type sous-jacent est transmis par registre. Par exemple, si le type sous-jacent est int ou unsigned int de taille 8, 16 ou 32 bits.

Remarque

Les futures versions du compilateur peuvent utiliser des registres pour stocker les paramètres.

L’utilisation de l’option du compilateur /Gr entraîne la compilation de chaque fonction dans le module, sauf __fastcall si la fonction est déclarée à l’aide d’un attribut en conflit, ou si le nom de la fonction est main.

Le __fastcall mot clé est accepté et ignoré par les compilateurs qui ciblent les architectures ARM et x64 ; sur une puce x64, par convention, les quatre premiers arguments sont passés dans les registres lorsque cela est possible, et d’autres arguments sont transmis sur la pile. Pour plus d’informations, consultez convention d’appel x64. Sur un processeur ARM, jusqu'à quatre arguments entiers et huit arguments à virgule flottante peuvent être transmis dans les registres, et des arguments supplémentaires sont transmis sur la pile.

Pour les fonctions de classe non statiques, si la fonction est définie hors ligne, le modificateur de convention d’appel n’a pas besoin d’être spécifié sur la définition hors ligne. En d’autres termes, pour les méthodes membres non statiques de classe, la convention d’appel spécifiée dans le cadre de la déclaration est utilisée par défaut au stade de la définition. Compte tenu de la définition de classe suivante :

struct CMyClass {
   void __fastcall mymethod();
};

le code suivant :

void CMyClass::mymethod() { return; }

équivaut au code :

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

Pour la compatibilité avec les versions précédentes, _fastcall il s’agit d’un synonyme de __fastcall l’option du compilateur /Za (Désactiver les extensions de langage) spécifiée.

Exemple

Dans l'exemple suivant, la fonction DeleteAggrWrapper correspond aux arguments transmis dans les registres :

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

FIN de la section spécifique à Microsoft

Voir aussi

Passage des arguments et conventions de dénomination
Mots clés