Storicamente, perché sembra quasi che tutti e il loro fratellino definiscano le proprie convenzioni di chiamata? Hai C, C++, Windows, Pascal, Fortran, Fastcall e probabilmente un milione di altri che non pensavo di menzionare. Non dovrebbe una convenzione essere la più efficiente per la stragrande maggioranza dei casi d'uso? C'è mai una buona ragione per preferire l'una rispetto all'altra?Perché ci sono così tante diverse convenzioni di chiamata?
risposta
Le convenzioni di chiamata citate sono state progettate nel corso dei decenni per diverse lingue e hardware diversi. Avevano tutti obiettivi diversi. cdecl supportava argomenti variabili per printf. stdcall ha prodotto un codice di codice più piccolo, ma senza argomenti variabili. Fastcall potrebbe velocizzare notevolmente le prestazioni di funzioni semplici con solo uno o due argomenti su macchine precedenti (ma raramente è una velocità attuale).
Nota che quando è stato introdotto x64, almeno su Windows, è stato progettato per una singola convenzione di chiamata.
Raymond Chen ha scritto una grande serie sulla storia delle convenzioni di chiamata, è possibile avviare here.
Amo l'articolo di Raymond Chen. Ha risposto a molte domande. – dsimcha
Perché storicamente tutti e il loro fratello minore hanno definito le proprie convenzioni di chiamata. Sono stati tutti creati per scopi diversi e quindi guidati da diverse esigenze di prestazioni. Ad esempio, C++ favorisce le ottimizzazioni per il passaggio del parametro this
.
- Alcuni di questi sono più efficienti per quanto riguarda le prestazioni e altri più efficienti in termini di dimensioni del codice.
- Alcune funzioni (conteggio di argomenti variabili) sono supportate solo con alcune convenzioni.
Ulteriori informazioni: http://en.wikipedia.org/wiki/X86_calling_conventions
Parte del motivo è l'architettura sottostante del microprocessore (o processore). La maggior parte delle lingue si avviano su una CPU specifica e restano un po 'invischiate con quell'architettura. Ad esempio, il vecchio computer della serie Univac 1100 non aveva nemmeno uno stack di chiamate!
Un'altra parte del motivo è che non è possibile prevedere la soluzione migliore finché non si sono tentati diversi modi di fare le cose.
Sono creati per scopi diversi e con diversi sistemi di ottimizzazione.
Ad esempio, per ridurre "Stack Overflow" (nessun gioco di parole) alcune persone hanno pensato a varie idee per chiamare la funzione per rendere impossibile lo stack overflow.
Un'altra istanza è il calcolo Lambda. Per non essere troppo vago, ma in Lambda, le funzioni possono solo passare un argomento e restituire un valore, e quindi hanno anche bisogno delle proprie convenzioni di chiamata.
- 1. Perché Java ha così tante edizioni diverse da C#?
- 2. Perché ci sono così tante funzioni di costruzione della mappa in clojure?
- 3. Perché ci sono così tanti diversi dialetti di espressioni regolari?
- 4. Perché ci sono così tante gemme strappate e che cosa fai delle dipendenze?
- 5. Oggetti richiamabili con diverse convenzioni di chiamata
- 6. Trasporto failover ActiveMQ - Perché così tante connessioni?
- 7. Perché WatchService genera così tante operazioni?
- 8. Perché così tante sp_resetconnections per il pooling di connessioni C#?
- 9. Perché le prestazioni di queste 2 query sono così diverse?
- 10. Cordova - FileSystem - perché così tante alternative di percorso?
- 11. Perché ci sono diverse annotazioni di gestione di fagioli
- 12. Le applicazioni win32 non sono così orientate agli oggetti e perché ci sono così tanti puntatori?
- 13. Perché ci sono così tanti backslash (\) nel file * .prof?
- 14. Perché viene richiamato getCount in adapter così tante volte?
- 15. Perché le convenzioni di denominazione dei test Jest sono così come sono?
- 16. Perché getCount viene chiamato così tante volte in PagerAdapter?
- 17. Perché ghc genera così tante espressioni caso nidificate dall'aspetto inutile?
- 18. Perché CakePHP utilizza diverse convenzioni di denominazione plurale/singolare?
- 19. Quando utilizzare le convenzioni di chiamata
- 20. Così tante parentesi nelle intestazioni standard di gcc
- 21. Perché i rifiuti di Android vengono raccolti così tante volte con ObjectMapper di Jacksons?
- 22. perché usare 'assert' in un progetto? (E perché usarlo così tante volte)
- 23. Convenzioni di denominazione JavaScript
- 24. perché ci sono più fcntl.h in linux?
- 25. Perché così tante collezioni di nome in .NET non implementare IEnumerable <T>?
- 26. Perché ci vuole così tanto tempo per creare un tavolo?
- 27. Perché le sorgenti Java hanno così tante cartelle l'una dentro l'altra?
- 28. Perché i vettori sono così poco profondi?
- 29. perché ci sono così tanti strumenti/tecnologie per fare lo stesso compito nella comunità open source
- 30. Perché ci sono così tanti $ IF DEFINED (CLR) in VCL/RTL?
+1 Secondo questa domanda! – Poni