__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
Comentarios
https://aka.ms/ContentUserFeedback.
Próximamente: A lo largo de 2024 iremos eliminando gradualmente GitHub Issues como mecanismo de comentarios sobre el contenido y lo sustituiremos por un nuevo sistema de comentarios. Para más información, vea:Enviar y ver comentarios de