__fastcall

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.

Elemento Implementación
Orden de paso de argumento Los dos DWORD primeros o más pequeños argumentos que se encuentran en la lista de argumentos de izquierda a derecha se pasan en los registros ECX y EDX; todos los demás argumentos se pasan en la pila de derecha a izquierda.
Responsabilidad de mantenimiento de pila Al llamar a la función aparece el argumento de la pila.
Convención de creación de nombres representativos Al signo (@) se le asigna el prefijo a los nombres; un signo seguido del número de bytes (en decimal) de la lista de parámetros se sufijo a los nombres.
Convención de traducción de mayúsculas y minúsculas No se lleva a cabo una traducción de mayúsculas y minúsculas.
Clases, estructuras y uniones Se trata como tipos "multibyte" (independientemente del tamaño) y pasados en la pila.
Enumeraciones y clases de enumeración Pasado por registro si el registro pasa su tipo subyacente. Por ejemplo, si el tipo subyacente es int o unsigned int de tamaño 8, 16 o 32 bits.

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 se compile como __fastcall, salvo que la función se declare con un atributo en conflicto o su nombre 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 Convención de llamadas 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 las funciones de clase no estáticas, si la función se define fuera de línea, el modificador de convención de llamada no tiene que especificarse 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; }

A efectos de compatibilidad con versiones anteriores, _fastcall es un sinónimo de __fastcall, a menos que se especifique la opción del compilador /Za (Deshabilitar extensiones de lenguaje).

Ejemplo

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

FIN de Específicos de Microsoft

Consulte también

Paso de argumentos y convenciones de nomenclatura
Palabras clave