Domanda

Quando una funzione che prende un puntatore nell'argomento viene inlineata, il compilatore rimuove l'inferimento durante il processo di ottimizzazione? Ovviamente quando ha senso ..

Ecco un esempio ovvio:

inline void say_hello (person* p) {
    std::cout << "hello " << p->name << std::endl;
}

int main () {
    person goldorak;
    goldorak.name = "Goldorak";

    say_hello(&goldorak);
    return 0;
}

Questo caso è banale ma se il compilatore è l'ottimizzazione ci sono alcuni casi in cui non lo fa?

Bonus: dove posso ottenere un elenco di alcune ottimizzazioni "di base" realizzate dal mio compilatore?

PS: sono solo curioso

È stato utile?

Soluzione

Sto assumendo GCC, e quindi il link che stai cercando è http://gcc.gnu.org/onlinerocs/gcc/optimize-options.html

E per citare: (potrebbe non essere quello che stavi ricevendo)

-Findecrect in linea in linea anche chiamate indirette che si scoprono di essere conosciute al momento della compilazione grazie al precedente in linea. Questa opzione ha alcun effetto solo quando lo stesso è attivato dalle opzioni di funzionalità-finline o funzionalità-sintesi.

Enabled at level -O2.

La documentazione equivalente per i compilatori di Visual Studio (incluso C ++)http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx(Puoi seguire i link per maggiori informazioni)

Altri suggerimenti

Un buon compilatore farebbe questo. Sarebbe un processo a due fasi, però. Innanzitutto avrebbe inlineato la funzione. Una fase successiva poteva quindi rendersi conto che l'unico uso della struttura è di tenere temporaneamente name ed eliminarlo.

Sì, nella mia esperienza questo è vero sia per i puntatori (C e C ++) che per i riferimenti (solo C ++) - praticamente qualsiasi compilatore decente ottimizzerà l'indirizzo ridondante. Anche Visual Studio lo fa.

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