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?
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? –
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