__fastcall
Seção específica da Microsoft
A convenção de chamada __fastcall
especifica se os argumentos para funções devem ser passados em registros, quando possível. Esta convenção de chamada se aplica somente à arquitetura x86. A lista a seguir mostra a implementação dessa convenção de chamada.
Elemento | Implementação |
---|---|
Ordem de passagem de argumentos | Os dois DWORD primeiros ou menores argumentos que são encontrados na lista de argumentos da esquerda para a direita são passados nos registros ECX e EDX, todos os outros argumentos são passados na pilha da direita para a esquerda. |
Responsabilidade de manutenção de pilha | A função de chamada retira os argumentos da pilha. |
Convenção de decoração de nome | No sinal (@) é prefixado aos nomes; Um sinal de arroba seguido do número de bytes (em decimal) na lista de parâmetros é sufixo para nomes. |
Convenção de conversão de maiúsculas/minúsculas | Nenhuma conversão de maiúsculas/minúsculas é realizada. |
Classes, estruturas e sindicatos | Tratados como tipos "multibyte" (independentemente do tamanho) e passados na pilha. |
Enums e classes de enum | Passado pelo registro se seu tipo subjacente for passado pelo registro. Por exemplo, se o tipo subjacente for int ou de tamanho 8, 16 ou unsigned int 32 bits. |
Observação
As versões futuras do compilador podem usar registros diferentes para armazenar parâmetros.
O uso da opção de compilador /Gr faz com que cada função no módulo seja compilada como __fastcall
a menos que a função seja declarada usando um atributo conflitante ou o nome da função seja main
.
A palavra-chave __fastcall
é aceita e ignorada pelos compiladores voltados para arquiteturas ARM e x64; em um chip x64, por convenção, os primeiros quatro argumentos são passados em registros quando possível, e os argumentos adicionais são passados na pilha. Para obter mais informações, consulte Convenção de chamada x64. Em um chip ARM, até quatro argumentos inteiros e oito argumentos de ponto flutuante podem ser passados em registros, e os argumentos adicionais são passados na pilha.
Para funções de classe não estáticas, se a função for definida fora de linha, o modificador de convenção de chamada não precisará ser especificado na definição fora de linha. Ou seja, para métodos de membro de classe não estática, a convenção de chamada especificada durante a declaração é assumida no ponto de definição. Dada esta definição de classe:
struct CMyClass {
void __fastcall mymethod();
};
isto:
void CMyClass::mymethod() { return; }
equivale a isto:
void __fastcall CMyClass::mymethod() { return; }
Para compatibilidade com versões anteriores, _fastcall
é um sinônimo para __fastcall
, a menos que a opção do compilador /Za (Desabilitar extensões de linguagem) seja especificada.
Exemplo
No exemplo a seguir, a função DeleteAggrWrapper
recebe argumentos passados em 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, ...);
Fim da seção específica da Microsoft
Confira também
Convenções de passagem e nomenclatura de argumentos
Palavras-chave
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de