Domanda

Ho visto la notazione fastcall aggiunta prima di molte funzioni.Perché è usato?

È stato utile?

Soluzione

Quella notazione prima della funzione è chiamata "Convenzione chiamante". Specifica come (ad un livello basso) il compilatore passerà i parametri di input alla funzione e recupera i risultati una volta eseguita.

Ci sono molte diverse convenzioni di chiamata, l'essere più popolare stdcall e cdecl.

Potresti pensare che ci sia solo un modo per farlo, ma in realtà, ci sono dozzine di modi in cui potresti chiamare una funzione e passare variabili dentro e fuori. È possibile posizionare i parametri di input su uno stack (premere, premere, premere per chiamare; POP, POP, POP per leggere i parametri di input). O forse preferiresti attaccarli nei registri (questo è fastcall - cerca di adattarsi ad alcuni dei parametri di ingresso nei registri per la velocità).

Ma allora per quanto riguarda l'ordine? Li spinchi da sinistra a destra oa destra a sinistra? Che dire del risultato - c'è sempre solo uno (assumendo parametri di riferimento), quindi effettua il risultato sullo stack, in un registro, ad un determinato indirizzo di memoria?

Inoltre, supponiamo che tu stia usando lo stack per la comunicazione - chi è il lavoro è quello di cancellare effettivamente lo stack dopo che la funzione è chiamata - il chiamante o il callee?

Che mi dici di eseguire il backup e il ripristino dei contenuti dei (certi) registri della CPU - Se il chiamante lo farà, o il callee garantisca che restituirà tutto il modo in cui era?

La convenzione di chiamata più popolare (di gran lunga) è cdecl, che è la convenzione di chiamata standard in C e C ++. L'API Win32 utilizza stdcall, il che significa qualsiasi codice che chiama l'API Win32 deve utilizzare stdcall per tali chiamate di funzione (rendendolo un'altra scelta popolare).

fastcall è un po 'di uno strano - Le persone realizzate per molte funzioni con un solo parametro IN / OUT, spingendo e spuntando da uno stack basato su memoria è un po' di sovraccarico e rende la funzione chiama un po 'pesante, quindi il diverso Compilatori introdotti (diversi) Chiamando Convenzioni che effettuano uno o più parametri nei registri prima di posizionare il resto nello stack per prestazioni migliori. Il problema è che non tutti i compilatori hanno usato le stesse regole per ciò che va dove e chi fa ciò che con fastcall, e come risultato devi stare attento quando lo usi perché non saprai mai chi fa cosa fa cosa fa cosa. Infine, vedere fastcall è davvero più veloce? per informazioni sui vantaggi delle prestazioni fastcall.

roba complicata.

Qualcosa di importante da tenere a mente: non aggiungere o modificare le convenzioni chiamando se non si conosce esattamente cosa stai facendo, perché se sia il chiamante che il callee non sono d'accordo La convenzione telefonica, probabilmente finirai con la corruzione dello stack e un Segfault. Questo di solito accade quando si ha la funzione che viene chiamata in una biblioteca DLL / condivisa e un programma è scritto che dipende dalla DLL / SO / DYLIB è una certa convenzione di chiamata (ad esempio, cdecl), quindi la biblioteca viene ricompilata con una chiamata diversa Convenzione (ad esempio, fastcall). Ora il vecchio programma non può più comunicare con la nuova libreria.

Altri suggerimenti

wikipedia afferma che

.

Le convenzioni intitolate FastCall non sono state standardizzate e sono state implementate in modo diverso, a seconda del fornitore del compilatore.In genere FastCall Calling Convenzioni passano uno o più argomenti nei registri che riducono il numero di accessi di memoria richiesti per la chiamata.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top