2016-05-02 9 views
6

Dire che ho la seguente classe:Sarà una classe vuota essere ottimizzato via

class A{ }; 

E poi nel mio codice ho una funzione:

A foo(){ 
    A ret; 
    //Do stuff 
    return ret; 
} 

E allora io uso la funzione più tardi .. ..

Un compilatore ottimizzatore (come g++) tratta solo lo foo() come una funzione void e salta effettivamente l'allocazione della memoria per l'oggetto vuoto? Potrebbe non farlo perché anche una classe vuota ha una dimensione di 1.

+1

Anche se non può essere ottimizzato (semanticamente), può essere restituito in un registro. In tal caso, perché ti importa se è ottimizzato o no? – StoryTeller

+0

@StoryTeller Perché voglio sapere se restituire una classe vuota mi fa male nel restituire il nulla – DarthRubik

+0

Ti fa male come? Non è veloce come semplicemente omettendo un valore di ritorno, certo. Ma difficilmente sembra un collo di bottiglia nelle prestazioni. – StoryTeller

risposta

6

Questo è un caso d'uso per gcc.godbolt.org in cui è possibile vedere quale codice assembler viene generato (ti consiglio di fare clic sul pulsante Colorize per vedere quale codice C++ corrisponde a quale codice assemblatore). È possibile vedere che anche con -O0 non viene generato alcun codice per allocare o copiare l'oggetto. Puoi provare con altri compilatori e livelli di ottimizzazione. È possibile utilizzare #define s per confrontare facilmente il codice tra restituendo class A e void.

+0

È perfetto ... – DarthRubik

+0

https://godbolt.org/g/XusxGE – xaxxon

+0

@DarthRubik considera l'assemblaggio generato sulla piattaforma effettiva su cui stai lavorando –

Problemi correlati