Domanda

public:
     inline int GetValue() const {
          return m_nValue;
     }
     inline void SetValue(int nNewValue) {
          this -> m_nValue = nNewValue;
     }

Il Scopri C ++ , che ha detto di voler correre più veloce. Così, ho pensato che sarebbe bello per l'uso su getter e setter. Ma forse, ci sono alcuni svantaggi ad esso?

È stato utile?

Soluzione

Io non in linea nulla fino a quando un profiler ha specificamente mi ha detto che non inlining si traduce in un problema di prestazioni.

Il compilatore C ++ è molto intelligente e sarà quasi certamente automaticamente inline tale funzione semplice come questo per voi. E in genere è più intelligente di te e farà un lavoro molto migliore a determinare ciò che dovrebbe o non dovrebbe essere inline.

Vorrei evitare di pensare a che cosa o non in linea e concentrarsi sulla soluzione. Aggiungendo la parola chiave inline tardi (che non è una garanzia di linea BTW) è molto facile da fare e luoghi potenziali può essere trovato facilmente con un profiler.

Altri suggerimenti

Se li si scrive all'interno della definizione, essi sono considerati inline di default .

Ciò significa che essi saranno consentiti in più unità di compilazione (dal momento che le definizioni di classe stessi appaiono in genere in molteplici unità di compilazione), non che essi saranno effettivamente essere inline.

Questa è una cattiva pratica in API pubblica è Qualsiasi modifica a queste funzioni richiede la ricompilazione di tutti i clienti.

In generale con getter e setter sta mostrando scarsa astrazione, non farlo. Se siete costantemente andando ai dati grezzi in un'altra classe, quindi è probabile necessità di ri organizzare le vostre classi, invece riflettere su come si desidera manipolare i dati all'interno di una classe e di fornire metodi appropriati per farlo.

I punti negativi:

  1. Il compilatore è libero di ignorare voi.

  2. Qualsiasi modifica a queste funzioni richiede la ricompilazione di tutti i clienti.

  3. Un buon compilatore inline funzioni non-inline comunque quando è opportuno.

Vorrei anche aggiungere che se non si sta eseguendo milioni di / setta per fotogramma, è praticamente irrilevante se questi sono inline o meno. E 'onestamente non vale la pena di perdere il sonno.

Inoltre, tenete a mente che solo perché si mette la parola 'inline' di fronte alla vostra dichiarazione di + definizione, non significa che il compilatore inline codice. E 'usi diversi euristica per capire se ha senso, che è spesso il commercio classico off di velocità vs dimensioni. V'è tuttavia la forza bruta '__forceinline' parola chiave, in locazione in VC ++ (non sono sicuro di cosa si tratta in GCC), che calpesta le euristiche compilatori fantasia. Io davvero non lo consiglio a tutti, e poi una volta che si porta a una diversa architettura, è probabile che non essere corretto.

Prova a mettere tutte le definizioni di funzioni nel file di implementazione, e lasciare le dichiarazioni puri per le intestazioni (a meno Certo che sei template metaprogrammazione (STL / BOOST / etc), nel qual caso, praticamente tutto è nelle intestazioni ;))

Uno dei classici luoghi gente come a linea (almeno nei videogiochi, che è da dove vengo), è nelle intestazioni di matematica. Cross / dot prodotti, lunghezze di vettore, matrice di compensazione, ecc sono spesso collocati nella testata, che penso solo non è necessaria. 9/10 non fa alcuna differenza per le prestazioni, e se mai bisogno di fare un loop stretto, come ad esempio trasformando una grande varietà di vettore da alcuni matrice, probabilmente stai meglio fare manualmente la linea di matematica, o meglio ancora di codifica in piattaforma specifica assembler.

Oh, e un altro punto, se si sente davvero bisogno di una classe per essere più dati rispetto del codice, considerare l'utilizzo di buona struct vecchio, che non porta il bagaglio OO dell'astrazione con esso, questo è ciò che è lì per. :)

Siamo spiacenti, non volevo andare avanti così tanto, ma penso solo che aiuta a prendere in considerazione i casi d'uso reali, e non troppo appeso su impostazioni del compilatore pedanti (credetemi, sono stato lì;))

In bocca al lupo.

Shane

Il codice verrà compilato un po 'più a lungo e si perde l'incapsulamento. Tutto dipende dalla dimensione del progetto e la sua natura. Nella maggior parte dei casi è OK per renderle in linea se non hanno alcuna logica complessa.

A proposito, è possibile saltare inline se si sceglie di implementare direttamente definizione di classe.

Per mettere il codice nell'intestazione, si sta esponendo le vostre lavorazioni classe interna. I clienti possono vedere questo e ipotesi make su come funziona la vostra classe. Questo può rendere più difficile cambiare la classe successiva senza rompere il codice del client.

Direi che non è necessario preoccuparsi di questo. Leggere la sezione FAQ su inlining .

Non è necessario, iniziare a fidarsi i compilatori, almeno per tali ottimizzazioni!
"Ma non sempre"

La parola chiave inline è priva di senso nel vostro caso

Compiler sarà inline la funzione, se può e vuole, a prescindere dalla parola chiave.

La linea che collega parola chiave influenza e non inlining. E 'un po' di confusione, ma leggere su di esso.

Se la definizione è in un'altra unità di compilazione (file di origine dopo il preprocessore, in fondo) che la chiamata, inlining sarà possibile solo se l'ottimizzazione del progetto insieme e collegamento generazione di codice di tempo sono abilitati. L'attivazione si aumenta notevolmente il tempo (dal momento che praticamente ri-compila tutto nel linker) che collega, ma, ovviamente, può migliorare le prestazioni. Non sono sicuro se è acceso o spento per impostazione predefinita in GCC e VS.

Devo dire, non ho la forte avversione a questa pratica che gli altri su questo thread sembrano avere. Sono d'accordo che il guadagno di prestazioni da inlining è trascurabile in tutti, ma i più utilizzati dei casi. (E sì, I sono incontrate questi casi nella pratica.) Dove faccio questo tipo di inlining, lo faccio per comodità, e in genere solo per battute come questa. Nella maggior parte dei miei casi d'uso, la necessità di evitare la ricompilazione sul lato client se mai cambiarli semplicemente non è così forte.

Sì, è possibile eliminare la inline, come è implicito il posizionamento della implementazione.

Inoltre, io sono un po 'sorpreso dalla veemenza contro di accesso. Difficilmente si può starnutire a una classe in qualsiasi lingua OO senza dilapidare alcuni verso il basso, e sono tutto sommato una tecnica valida per implementazione astratta da interfaccia, quindi è un po 'masochista di rivendicare loro come cattiva pratica OO. E ' è un buon consiglio non di accesso di scrittura indiscriminatamente, ma vi consiglio anche di non avere portato via nello zelo per sradicarle.

Prendi questo, i puristi. : -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top