__fastcall
Específicos do Microsoft
O __fastcall convenção de chamada Especifica que os argumentos para funções são a serem passados nos registradores, quando possível.A lista a seguir mostra a implementação dessa convenção de chamada.
Elemento |
Implementação |
---|---|
Ordem de passagem de argumento |
As duas primeiras DWORD ou menores argumentos são passados em ECX e EDX registradores; todos os outros argumentos são passados para a direita para a esquerda. |
Responsabilidade de manutenção de pilha |
Chamada função pops os argumentos da pilha. |
Convenção de nome-decoration. |
Arroba (@) é prefixada nomes; uma arroba seguido do número de bytes (em decimal) no parâmetro lista é sufixada nomes. |
Convenção de tradução de caso |
Nenhuma conversão de maiúsculas executada. |
Observação |
---|
Versões futuras do compilador podem usar registradores diferentes para armazenar os parâmetros. |
Usando o /Gr opção de compilador que faz com que cada função no módulo para compilar como fastcall a menos que a função é declarada com um atributo em conflito ou o nome da função é main.
Em máquinas de família de processador Itanium (IPF) e AMD64, __fastcall é aceito e ignorado pelo compilador; em um chip IPF, por convenção, parâmetros são passados no registro.
Para funções de classe non-static, se a função é definida de fora de linha, o modificador de convenção de chamada não tem a ser especificado na definição de out-of-line.Ou seja, para métodos de membro não estático da classe, será adotada a convenção de chamada especificada durante a declaração no momento da definição.Dada a definição de classe,
struct CMyClass {
void __fastcall mymethod();
};
Isso
void CMyClass::mymethod() { return; }
é equivalente a isso
void __fastcall CMyClass::mymethod() { return; }
Exemplo
No exemplo a seguir, a função chamada DeleteAggrWrapper é passado argumentos nos registradores:
// 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, ...);