__fastcall

 

Para obtener la documentación más reciente de Visual Studio 2017 RC, consulte Documentación de Visual Studio 2017 RC.

Específicos de Microsoft

La convención de llamada __fastcall especifica que los argumentos de las funciones deben pasarse en registros siempre que sea posible. Esta convención de llamada solo se aplica a la arquitectura x86. En la lista siguiente se muestra la implementación de esta convención de llamada.

ElementoImplementación
Orden de paso de argumentoLos primeros dos argumentos DWORD o menores que se encuentran en la lista de argumentos de izquierda a derecha se pasan en registros ECX y EDX; el resto de los argumentos se pasan en la pila de derecha a izquierda.
Responsabilidad de mantenimiento de pilaAl llamar a la función aparece el argumento de la pila.
Convención de creación de nombres representativosEl signo de arroba (@) suele usarse como prefijo para los nombres y el signo de arroba seguido del número de bytes (en formato decimal) en la lista de parámetros se utiliza como sufijo de los nombres.
Convención de traducción de mayúsculas y minúsculasNo se lleva a cabo una traducción de mayúsculas y minúsculas.
System_CAPS_ICON_note.jpg Nota

Las futuras versiones del compilador pueden utilizar distintos registros para almacenar parámetros.

El uso de la opción del compilador /Gr hace que cada función del módulo compile como __fastcall salvo que la función se declare con un atributo en conflicto o el nombre de la función sea main.

Los compiladores dirigidos a las arquitecturas ARM y x64 aceptan y omiten la palabra clave __fastcall; en un chip x64, por convención, los primeros cuatro argumentos se pasan en registros cuando sea posible y los argumentos adicionales se pasan en la pila. Para obtener más información, vea Información general sobre las convenciones de llamada x64. En un chip ARM, se puede pasar hasta cuatro argumentos enteros y ocho argumentos de punto flotante en los registros; los argumentos adicionales se pasan en la pila.

En el caso de funciones de clase no estáticas, si la función se define fuera de línea, no es necesario especificar el modificador de convención de llamada en la definición fuera de línea. Es decir, para los métodos miembro no estáticos de clase, en el momento de la definición se supone la convención de llamada especificada durante la declaración. Dada esta definición de clase:

struct CMyClass {  
   void __fastcall mymethod();  
};  

esto:

void CMyClass::mymethod() { return; }  

equivale a esto:

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

En el siguiente ejemplo, se pasan argumentos a la función DeleteAggrWrapper en los registros:

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

Paso de argumentos y convenciones de nomenclatura
Palabras clave de C++

Mostrar: