Se ho una classe A (che restituisce un oggetto di valore), e due funzioni f() eg() con la differenza in appena loro variabili di ritorno:In che modo una funzione restituisce in base al valore?
class A
{
public:
A() { cout<<"constructor, "; }
A (const A&) { cout<<"copy-constructor, "; }
A& operator = (const A&) { cout<<"assignment, "; }
~A() { cout<<"destructor, "; }
};
const A f(A x)
{A y; cout<<"f, "; return y;}
const A g(A x)
{A y; cout<<"g, "; return x;}
main()
{
A a;
A b = f(a);
A c = g(a);
}
Ora, quando eseguo la linea A b = f(a);
, emette:
copy-constructor, constructor, f, destructor
, che va bene assumendo che l'oggetto y in f() venga creato direttamente nella destinazione cioè nella posizione di memoria dell'oggetto b, e non vi siano temporaries coinvolti.
Mentre quando eseguo la linea A c = g(a);
, essa stampa:
copy-constructor, constructor, g, copy-constructor, destructor, destructor,
.
Quindi la domanda è: perché nel caso di g() l'oggetto non può essere creato direttamente nella posizione di memoria di c, come è successo durante il richiamo di f()? Perché chiama un ulteriore copy-constructor (che presumo sia dovuto al coinvolgimento temporaneo) nel secondo caso?
Se si desidera che il compilatore esegua le ottimizzazioni, è necessario compilare con le ottimizzazioni abilitate. –
Non penso che abbia nulla a che fare con le ottimizzazioni del compilatore come ho già provato. – cirronimbo