2011-03-01 10 views
7

Eventuali duplicati:
Can a recursive function be inline?Cosa succederà se la funzione ricorsiva è definita come inline?

Penso che la funzione ricorsiva definita come linea non avrà alcun effetto e non verrà fatta in linea a tutti. Perché, il compilatore non sa quanti livelli per replicare il codice della funzione inline. qualche idea?

+0

domanda interessante ... –

+0

anche rilevanti:. Http://stackoverflow.com/questions/34125/which-if-any-c-compilers-do-tail-recursion-optimization –

risposta

3

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,

2

Ovviamente non sarà in grado di ripetere il codice degli annunci all'infinito. Potrebbe esserci un modo per farlo in un modo limitato, lo svolgimento del loop loop, ma questo sarebbe probabilmente più difficile da determinare per il compilatore rispetto a un semplice ciclo for(int i=0; i < 5; ++i).

Disponibile anche per il compilatore è un tail call se la funzione è codificata in un modo speciale. Mentre non ripete l'assemblaggio byte per byte nel punto della chiamata, può evitare di impostare uno stack frame e la funzione e sostituirla con solo un'istruzione jmp, in modo che la chiamata di funzione richieda non meno di overhead di if dichiarazione.

Problemi correlati