2015-04-23 10 views
5

Per abitudine io scrivo spesso definizioni di funzioni in linea per le funzioni semplici come questo (esempio inventato)L'ottimizzazione del tempo di collegamento in gcc 5.1 è sufficiente per rinunciare a funzioni semplici di inlining?

class PositiveInteger 
{ 
private: 
    long long unsigned m_i; 
public: 
    PositiveInteger (int i); 
}; 

inline PositiveInteger :: PositiveInteger (int i) 
: m_i (i) 
{ 
    if (i < 0) 
     throw "oops"; 
} 

Io generalmente piace separare i file di interfaccia e file di implementazione ma, tuttavia, questa è mia abitudine per quelle funzioni che la voce nella mia testa mi dice che probabilmente verrà colpita molto nei punti caldi.

So che il consiglio è "primo profilo" e sono d'accordo, ma ho potuto evitare un intero carico di profiling sforzo se sapevo a priori che il compilatore avrebbe prodotto identico codice oggetto finale se le funzioni di questo tipo sono stati inline alla compilazione o tempo di collegamento. (Inoltre, ritengo che il codice di profilazione iniettato possa causare un cambiamento di tempistica che sommerge l'effetto di funzioni molto semplici come quella precedente.)

GCC 5.1 è stato appena pubblicato pubblicando miglioramenti LTO (link time optimization). Quanto sono bravi davvero? Quali tipi di funzioni posso svelare in maniera sicura sapendo che l'eseguibile finale non sarà influenzato?

+7

Quel codice formattazione ... fa male ... gli occhi. 'PositiveInteger :: PositiveInteger' è il nome di una cosa. È qualificato, ma rimane solo un nome. Perché ci metti degli spazi? –

+0

Trovo che il modo in cui lo hai scritto fa male * i miei * occhi, anche se mi rendo conto che è più comune di gran lunga. Stessa argomentazione per mettere lo spazio bianco in qualsiasi altro posto. – spraff

risposta

1

È già risposto alla tua domanda: A meno che non ci si rivolge un sistema embedded di qualche tipo con risorse limitate, scrivere il codice per la chiarezza e manutenibilità prima. Poi se prestazione non è accettabile è possibile profilo e indirizzare i tuoi sforzi verso i punti caldi attuali. Pensaci: se scrivi un codice più chiaro che richiede 250 netti extra che non si notano nel tuo caso d'uso, il tempo extra non ha importanza.

+0

La premessa è che * * si capita di essere significativamente più lento se il compilatore non inline esso. Se, tuttavia, so che il compilatore * lo renderà in linea, allora posso * smettere di pensarci del tutto *. Senza profilazione – spraff

0

GCC con LTO fa cross-modulo inline, quindi la maggior parte del tempo non si dovrebbe vedere la differenza in termini di qualità del codice. Anche le dichiarazioni di funzioni offline non vengono duplicate tra le unità di traduzione e vengono compilate più velocemente/producono file di oggetti più piccoli.

euristica inline di GCC tuttavia considerano parola chiave "in linea", come un suggerimento che la funzione è probabilmente un bene per essere inline e aumentare i limiti sulle dimensioni funzione. Allo stesso modo ci vorrà un po 'di suggerimento in più per le funzioni dichiarate nella stessa unità di traduzione così come è stata chiamata. Per piccole funzioni come una nel tuo esempio questo non dovrebbe comunque fare alcuna differenza.

Problemi correlati