2010-02-23 25 views
7

Cosa sono questi? E come sono influenzato da questi come sviluppatore?Che cosa sono le convenzioni per le chiamate personalizzate?

correlati:
What are the different calling conventions in C/C++ and what do each mean?

+0

In quale contesto? Win32? Win64? Linux? Solaris? Intel? PowerPC? –

+2

duplicato: http://stackoverflow.com/questions/949862/what-are-the-different-calling-conventions-in-cc-and-what-do-each-mean – Earlz

+11

Sospetto che le persone che hanno votato per chiudere questo o (a) ** non capisco quali convenzioni di chiamata _custom_ sono ** o (b) ** non ha letto correttamente la domanda **. Sono un'ottimizzazione speciale, che non è coperta dalla domanda duplicata. Votazione per riaprire e cancellare le informazioni duplicate. –

risposta

9

A La convenzione di chiamata descrive come qualcosa può chiamare un'altra funzione. Ciò richiede che i parametri e lo stato vengano passati all'altra funzione, in modo che possa eseguire e restituire il controllo correttamente. Il modo in cui questo viene fatto deve essere standardizzato e specificato, in modo che il compilatore sappia come ordinare i parametri per il consumo dalla funzione remota che viene chiamata. Ci sono diverse convenzioni di chiamata standard, ma i più comuni sono fastcall, stdcall, e cdecl.

Di solito, il termine personalizzato convenzione di chiamata è un po 'un termine improprio e si riferisce a una delle due cose:

  • Un non-standard di convenzione di chiamata o di uno che non è in diffusa utilizzare (ad es. se stai costruendo un'architettura da zero).

  • Una speciale ottimizzazione che un compilatore/linker può eseguire utilizzando una convenzione di chiamata one-shot allo scopo di migliorare le prestazioni.

In quest'ultimo caso, ciò causa alcuni valori che altrimenti verrebbero inseriti nello stack per essere memorizzati in registri. Il compilatore proverà a prendere questa decisione in base a come i parametri vengono utilizzati all'interno del codice. Ad esempio, se il parametro verrà utilizzato come valore massimo per un indice di loop, in modo tale che l'indice venga confrontato con il massimo di ogni iterazione per vedere se le cose dovrebbero continuare, sarebbe un buon caso per spostarlo in un Registrare.

Se l'ottimizzazione viene eseguita, questo in genere riduce le dimensioni del codice e migliora le prestazioni.

E come sono interessato da questi come sviluppatore?

Dal punto di vista di uno sviluppatore, probabilmente non ti interessa; questa è un'ottimizzazione che avverrà automaticamente.

1

Ogni lingua, quando si chiama una funzione, ha una convenzione su ciò che verranno passati parametri variabili di registro vs sullo stack, e come valori restituiti sarà restituito.

A volte viene utilizzata una convenzione diversa da quella standard e viene chiamata convenzione di chiamata personalizzata.

Questo è più comune quando si interagisce tra lingue diverse. Ad esempio, C e Pascal hanno convenzioni diverse su come passare i parametri. Dal punto di vista di C, la convenzione di chiamata Pascal potrebbe essere definita convenzione di chiamata personalizzata.

+0

"pascal" non è una convenzione di chiamata personalizzata: è una normale convenzione chiamata denominata. Inoltre, è storia, non è vero? Una reliquia da 16 giorni? – Steve314

+1

Ho detto che è una convenzione di chiamata personalizzata dal punto di vista di C, che è corretta. Inoltre, è un esempio adatto per spiegare il concetto, e certamente non meritevole di un downvote. –

0

A meno che non si stia manipolando direttamente lo stack o si scriva un assembly inline facendo riferimento a variabili locali, ciò non influisce su di voi. Oppure se il tuo interfacciamento con librerie collegate a convenzioni di chiamata diverse

Che cos'è: la maggior parte dei compilatori utilizza una convenzione di chiamata standard come cdecl in cui gli argomenti delle funzioni vengono inseriti in un determinato ordine nello stack e così via.

+0

Questo non è giusto. Ha chiesto delle convenzioni sulle chiamate personalizzate, che sono un'ottimizzazione speciale e non corrispondono in particolare a particolari convenzioni di chiamata esistenti. –

1

Non penso che tu abbia davvero bisogno di preoccuparti.

Le convenzioni di chiamata normale sono cose come __stdcall e __fastcall. Determinano come la firma della chiamata viene convertita in un layout stack, chi (chiamante o chiamato) è responsabile del salvataggio e del ripristino dei registri, ecc. Ad esempio, __fastcall dovrebbe utilizzare più registri dove __stdcall userebbe più stack.

Le convenzioni di chiamata personalizzate sono ottimizzate specificamente per una particolare funzione e il modo in cui viene utilizzata. Succedono solo, IIRC, per funzioni che sono locali a un particolare modulo. È così che il compilatore sa molto su come viene utilizzato, e anche su come si sa che nessun chiamante esterno deve essere in grado di specificare la convenzione.

In base a ciò, il compilatore li utilizzerà automaticamente, se necessario, il codice verrà eseguito leggermente più veloce e/o occuperà leggermente meno spazio, ma non è necessario preoccuparsene.

Problemi correlati