Ho provato a cercare le domande SO relative per trovare una risposta chiara e chiara per te, ma ahimè e hellip;
Così, il keywoard inline
(o una funzione di membro essendo implicitamente inline definito nella definizione della classe) ha due effetti:
It garanzie che la funzione può essere definito in più unità di traduzione senza violare la regola della One Definition, cioè in pratica, senza che il linker protesta su più definizioni. Per questo uso tutte le definizioni delle funzioni devono essere inline
e devono essere identiche.
Serve come un vago suggerimento al compilatore per incorporare il codice macchina per le chiamate alla funzione. Alcune chiamate potrebbero essere inline, altre no. Il grado di inlining può variare, e un compilatore può anche ignorare completamente questo suggerimento (in pratica, g ++ ha la tendenza a seguire il suggerimento in modo assurdo e forse un po 'sfortunato, mentre Visual C++ più piace a ignorarlo).
Per una funzione ricorsiva, se un compilatore segue la traccia di alcun particolare richiamo della funzione, la chiamata può essere espansa a uno o due o tre o qualunque livelli di ricorsione. È una cosa difficile da fare, quindi non contare su di esso ’. Inoltre, il compilatore ’ s propri euristiche per inline sono probabilmente meglio del tuo istinto, perché il compilatore ha una visione più globale delle cose (si sa di più), quindi, riassumendo:
Non utilizzare inline
per l'effetto accennato, usalo per la garanzia ODR.
Dove si ’ re assolutamente sicuro che tu sai meglio di compilatore, e in cui è stato rispettato principi come "prima misura" e "non fare l'ottimizzazione prematura", si può essere in grado di ottenere più controllo affidabile dell'inlining tramite estensioni o pragmi specifici del linguaggio del compilatore.
Acclamazioni & hth,
fonte
2011-03-01 04:48:15
domanda interessante ... –
anche rilevanti:. Http://stackoverflow.com/questions/34125/which-if-any-c-compilers-do-tail-recursion-optimization –