__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