La correttezza del codice che scrivi non dovrebbe mai dipendere da un'ottimizzazione. Dovrebbe produrre il risultato corretto quando eseguito sulla "macchina virtuale" C ++ che usano nelle specifiche.
Tuttavia, ciò di cui parli è più una questione di efficienza. Il tuo codice funziona meglio se ottimizzato con un compilatore di ottimizzazione RVO. Va bene, per tutti i motivi indicati nelle altre risposte.
Tuttavia, se hai bisogno di questa ottimizzazione (come se il costruttore della copia causasse effettivamente il fallimento del codice), ora sei ai capricci del compilatore.
Penso che il miglior esempio di questo nella mia pratica sia l'ottimizzazione delle chiamate di coda:
int sillyAdd(int a, int b)
{
if (b == 0)
return a;
return sillyAdd(a + 1, b - 1);
}
È un esempio sciocco, ma mostra una coda, in cui una funzione viene chiamata ricorsivamente proprio alla fine di una funzione. La macchina virtuale C ++ mostrerà che questo codice funziona correttamente, anche se potrei causare un po 'di confusione sul motivo per cui mi sono preso il disturbo di scrivere una routine di aggiunta in primo luogo. Tuttavia, nelle implementazioni pratiche di C ++, abbiamo uno stack e ha uno spazio limitato. Se eseguita pedanticamente, questa funzione dovrebbe spingere almeno i b + 1
frame dello stack nello stack mentre fa la sua aggiunta. Se voglio calcolare sillyAdd(5, 7)
, questo non è un grosso problema. Se voglio calcolare sillyAdd(0, 1000000000)
, potrei essere davvero nei guai a causare uno StackOverflow (e non il tipo buono ).
Tuttavia, possiamo vedere che una volta raggiunta l'ultima linea di ritorno, abbiamo davvero finito con tutto nel frame dello stack corrente. Non abbiamo davvero bisogno di tenerlo in giro. L'ottimizzazione delle chiamate di coda consente di "riutilizzare" il frame dello stack esistente per la funzione successiva. In questo modo, abbiamo bisogno solo di 1 frame dello stack, anziché b+1
. (Dobbiamo ancora fare tutte quelle stupide aggiunte e sottrazioni, ma non occupano più spazio.) In effetti, l'ottimizzazione trasforma il codice in:
int sillyAdd(int a, int b)
{
begin:
if (b == 0)
return a;
// return sillyAdd(a + 1, b - 1);
a = a + 1;
b = b - 1;
goto begin;
}
In alcune lingue, l'ottimizzazione delle chiamate di coda è esplicitamente richiesta dalla specifica. C ++ non è uno di quelli. Non posso fare affidamento sui compilatori C ++ per riconoscere questa opportunità di ottimizzazione delle chiamate di coda, a meno che non vada caso per caso. Con la mia versione di Visual Studio, la versione di rilascio esegue l'ottimizzazione delle chiamate di coda, ma la versione di debug no (in base alla progettazione).
Quindi sarebbe male per me dipendere dalla capacità di calcolare sillyAdd(0, 1000000000)
.