2011-10-23 13 views
5

Ho una classe cnVector che rappresenta un punto nello spazio tridimensionale. I suoi operatori + - */sono utilizzati intensivamente.
La loro applicazione è molto breve:Dovrei usare `inline` su funzioni molto usate?

cnVector cnVector::operator + (const cnVector& v) const { 
    return cnVector(
     x + v.x, 
     y + v.y, 
     z + v.z); 
} 

La mia domanda è, perché questa funzione è molto breve, dovrei inline che anche se il suo uso intensivo? o genererebbe troppo codice quando lo usa quello molto?

+1

Il contrassegno I funziona in modo semplice come inline. Non importa molto però, se si dice al compilatore di incorporare qualsiasi aspetto. "Inline any suitable" su MSVC. Non so su GCC. –

+2

Il passaggio di GCC ['-finline-functions'] (http://gcc.gnu.org/onlinedocs/gcc/Inline.html) fornirà istruzioni per le funzioni inline automaticamente che si ritiene debbano essere sottolineate. –

+2

My GCC (4.4.5) applica '-finline-small-functions' come ottimizzazione di base (ad es.' -O'/'-O1' e successive). –

risposta

5

Ricorda che usando in linea è mai una garanzia, ma dà solo un suggerimento per il compilatore. Dubito che l'inline aumenterà di molto la dimensione dell'eseguibile, la funzione è di per sé molto piccola.
Chiamare la funzione è quasi la stessa dimensione della funzione stessa.

2

Il compilatore è perfettamente in grado di prendere una decisione sull'integrazione di una funzione o meno in base al profilo di ottimizzazione scelto.

È necessario inline una funzione se il compilatore no, e la profilazione con un set di dati realistico mostra che si sta spendendo una quantità significativa di tempo nella funzione, l'algoritmo che utilizza tale funzione è efficiente e se inlining mostra un miglioramento della velocità in un benchmark con detto set di dati.

1

In caso di dubbio, compilarlo con e senza in linea e confrontare la velocità e la dimensione di esecuzione. Il compilatore di solito offre un interruttore per il profiling come mentionend sopra per vedere quali sono i costi delle chiamate di funzione, misurato nel tempo,

3

Applicare inline a tutte funzioni che vengono definite nell'intestazione sulla portata dello spazio dei nomi per evitare di rompere il One Definition Rule. Questo, a proposito, non è completamente correlato all'inlining, nonostante il nome della parola chiave. (O metterli all'interno di un namespace anonimo.)

inlineanche dà un suggerimento per il compilatore a linea chiama a tale funzione, ma come i commenti che hanno sottolineato il compilatore è perfettamente in grado di capire che da essa stessa in modo la parola chiave non è davvero necessaria per questo.