Pergunta

Eu vi o fastcall notação acrescentado antes de muitas funções.Por que é usado?

Foi útil?

Solução

Essa notação antes que a função é chamada a "convenção de chamada." Ele especifica como (em um nível baixo) o compilador irá passar parâmetros de entrada para a função e recuperar seus resultados uma vez que ele foi executado.

Há muitos diferentes convenções de chamada, sendo as mais populares stdcall e cdecl.

Você pode pensar que só há uma maneira de fazê-lo, mas, na realidade, existem dezenas de maneiras de que você pode chamar uma função e passar variáveis dentro e fora.Você pode colocar os parâmetros de entrada em uma pilha (push, push, push para chamar;pop, pop, pop para ler os parâmetros de entrada).Ou talvez você, ao invés de colocá-los em registos (este é fastcall - ele tenta se encaixar em alguns de entrada params nos registos de velocidade).

Mas então, o que sobre a ordem?Você empurrá-los da esquerda para a direita ou da direita para a esquerda?O que sobre o resultado - sempre há apenas um (supondo que não há parâmetros de referência), de modo que você coloque o resultado na pilha, em um registro em um determinado endereço de memória?

Além disso, vamos supor que você está usando a pilha de comunicação - que é o trabalho que é para realmente limpar a pilha depois que a função é chamada, o chamador ou o receptor?

O que sobre como fazer backup e, em seguida, restaurar o conteúdo de (certos) registradores de CPU, deve o autor da chamada fazê-lo, ou será que o receptor garantia de que ele vai voltar tudo como era?

Os mais populares convenção de chamada (por agora) é cdecl, que é a convenção de chamada padrão em C e C++.A API do WIN32 usa stdcall, o que significa que qualquer código que chama a API do WIN32 precisa usar stdcall para aqueles chamadas de função (tornando-se outra escolha popular).

fastcall é um pouco de um excêntrico - as pessoas perceberam para muitas funções com apenas um parâmetro in/out, empurrar e pegar a partir de uma memória baseada em pilha é um pouco de sobrecarga e faz chamadas de função um pouco pesado, então os compiladores diferentes introduzido (diferentes) de convenções de chamada que vai colocar um ou mais parâmetros em registros antes de colocar o resto na pilha para um melhor desempenho.O problema é que nem todos os compiladores utilizados as mesmas regras para o que vai para onde e quem faz o que com fastcall, e , como resultado, você tem que ter cuidado ao usá-lo, porque você nunca vai saber quem faz o quê.Finalmente, veja É fastcall realmente mais rápido? para informações sobre fastcall benefícios de desempenho.

Coisas complicadas.

Algo importante para manter em mente:não adicionar ou alterar as convenções de chamada se você não sabe exatamente o que você está fazendo, porque se o emissor e o receptor não concorda com a convenção de chamada, você provavelmente vai acabar com a corrupção de pilha e um segfault.Isso geralmente acontece quando você tiver a função a ser chamada de uma DLL/biblioteca partilhada e um programa é escrito de que depende a DLL/PARA/dylib ser uma certa convenção de chamada (por exemplo, cdecl) e, em seguida, a biblioteca é recompilado com uma convenção de chamada diferente (por exemplo, fastcall).Agora, o antigo programa não pode mais se comunicar com a nova biblioteca.

Outras dicas

Wikipedia afirma que

.

As convenções intituladas FastCall não foram padronizadas e foram implementadas de forma diferente, dependendo do fornecedor do compilador.Tipicamente fastcall chamando convenções passam um ou mais argumentos em registros que reduz o número de acessos de memória necessários para a chamada.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top