Domanda

Capisco che puoi usare la parola chiave inline o semplicemente inserire un metodo in una dichiarazione di classe come short ctor o un metodo getter, ma il compilatore prende la decisione finale su quando incorporare i miei metodi?

Ad esempio:

inline void Foo::vLongBar()
{
   //several function calls and lines of code
}

Il compilatore ignorerà la mia dichiarazione in linea se pensa che renderà il mio codice inefficiente?

Come problema secondario, se ho un metodo getter dichiarato fuori dalla mia classe in questo modo:

void Foo::bar() { std::cout << "baz"; }

Il compilatore lo inserirà sotto le copertine?

È stato utile?

Soluzione

Il fatto che una fessura sia allineata o meno è, in fin dei conti, totalmente dipendente da il compilatore. In genere, più una funzione è complessa in termini di flusso, meno è probabile che il compilatore la incorpori. e alcune funzioni, come quelle ricorsive, semplicemente non possono essere integrate.

Il motivo principale per cui non è stata incorporata una funzione è che aumenterebbe notevolmente la dimensione complessiva del codice, evitando che iot venga conservato nella cache del processore. Questa sarebbe in realtà una pessimizzazione, piuttosto che un'ottimizzazione.

Per consentire al programmatore di decidere di spararsi al piede, o altrove, puoi incorporare la funzione da solo: scrivi il codice che sarebbe andato nella funzione in quello che sarebbe stato il sito di chiamata della funzione.

Altri suggerimenti

Sì, la decisione finale se incorporare o meno il codice risiede nel compilatore C ++. La parola chiave incorporata è un suggerimento, non un requisito.

Ecco alcuni dettagli su come questa decisione viene elaborata nel compilatore Microsoft C ++

Come molti hanno già pubblicato, la decisione finale spetta sempre al compilatore, anche se puoi dare suggerimenti fermi come forceinline.
Parte della logica è che l'allineamento non è un automatico "andare più veloce" interruttore. Un eccesso di allineamento può rendere il codice molto più grande e interferire con altre ottimizzazioni. Vedi Le FAQ Lite C ++ sulle funzioni e le prestazioni inline .

Come altri hanno notato, la parola chiave inline è semplicemente un suggerimento per il compilatore di incorporare il codice. Poiché il compilatore incorporerà di routine il codice che non è stato contrassegnato con inline e non il codice inline che lo ha, la parola chiave sembra ridondante quanto register o (pre-C ++ 0x) auto .

Tuttavia, c'è un'altra cosa che la parola chiave inline : modifica il collegamento della funzione da esterno (il valore predefinito per funzioni) a in linea . Il collegamento in linea consente a ciascuna unità di compilazione di contenere la propria copia del codice oggetto e consente al linker di rimuovere copie ridondanti dall'eseguibile finale. Se questo ti ricorda i modelli, sì, anche i modelli usano il collegamento in linea.

Sì, il compilatore ha la decisione finale. In VS puoi persino incorporare le funzioni ricorsive nella profondità specificata ;)

#pragma inline_depth( [0... 255] )

Solo per aggiungere i miei 5 centesimi ...

Ho trovato molto utile questo Guru of Week sull'allineamento.

Per quanto ricordo, ho letto da qualche parte che anche un linker potrebbe fare inline, quando collega i file oggetto e scopre che il codice da collegare può essere inline.

Saluti,
Ovanes

  

Come problema secondario, se ho un metodo getter dichiarato fuori dalla mia classe in questo modo:

void Foo::bar() { std::cout << "baz"; }
  

Il compilatore lo inserirà sotto le copertine?

Dipende. Può farlo per tutti i chiamanti nella stessa unità di traduzione (il file .cpp e tutte le sue definizioni #incluse). Deve comunque compilare una versione non incorporata perché potrebbero esserci chiamanti di quella funzione al di fuori dell'unità di traduzione. Puoi potenzialmente vederlo al lavoro (se il tuo compilatore può effettivamente farlo) ad alti livelli di ottimizzazione. (In particolare: confronta cosa succede quando #includi tutti i tuoi file .cpp in un .cpp rispetto al layout tipico. Con tutte le definizioni in un'unità di traduzione le opportunità per tale inclinazione aumentano notevolmente.)

Per quanto ne so, il compilatore renderà automaticamente una funzione dichiarata in linea (o scritta all'interno di una dichiarazione di classe) non in linea se trova un ciclo simile a, mentre ecc. Questo è un esempio in cui il compilatore ha l'ultima parola nelle funzioni inline.

Se devi davvero, assolutamente, assolutamente, ESSERE NECESSARIO inserire il codice, c'è sempre la macro. C li supporta da anni e poiché sono solo sostituti del testo prima della compilazione, in linea con ciò che scrivi.

Ecco perché la parola chiave "inline" (e persino, in alcuni casi, le varianti forzate) può permettersi di non avere un modo standard per forzarla - puoi sempre scrivere una macro.

Detto questo, la parola chiave inline è spesso migliore, perché il compilatore abbastanza spesso sa se rendere una funzione inline ha un senso o meno e perché l'inline può interagire con il resto delle ottimizzazioni del compilatore.

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