Fino ad oggi, avevo sempre pensato che i compilatori decenti convertissero automaticamente la struct pass-by-value in pass-by-reference se la struttura fosse abbastanza grande da rendere quest'ultima più veloce. Per quanto ne so, sembra un'ottima ottimizzazione. Tuttavia, per soddisfare la mia curiosità sul fatto che ciò accada realmente, ho creato un semplice caso di test sia in C++ che in D e ho esaminato l'output di GCC e Digital Mars D. Entrambi hanno insistito sul passaggio di strutture a 32 byte in base al valore quando tutte le la funzione in questione è stata aggiungere i membri e restituire i valori, senza alcuna modifica della struttura passata. La versione C++ è riportata di seguito.Perché non viene passata la struttura per riferimento a un'ottimizzazione comune?
#include "iostream.h"
struct S {
int i, j, k, l, m, n, o, p;
};
int foo(S s) {
return s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p;
}
int main() {
S s;
int bar = foo(s);
cout << bar;
}
La mia domanda è, perché diavolo non sarebbe qualcosa di simile essere ottimizzato dal compilatore di passare per riferimento in realtà invece di spingere tutti quei int
s nello stack?
Nota: interruttori del compilatore utilizzati: GCC -O2 (-O3 inline foo().), DMD -O -line -release.
Modifica: Ovviamente, nel caso generale la semantica del pass-by-value rispetto al pass-by-reference non sarà la stessa, ad esempio se i costruttori di copia sono coinvolti o la struttura originale viene modificata nel callee . Tuttavia, in molti scenari del mondo reale, la semantica sarà identica in termini di comportamento osservabile. Questi sono i casi che sto chiedendo.
Quando si esegue l'ottimizzazione del link-time, la generazione di un time code del collegamento a.k.a. o l'intera compilazione del programma, il compilatore non ha bisogno di compilare la chiamata solo in base alla dichiarazione. Ha una visione completa di ciò che sta succedendo. Per la compilazione di applicazioni embedded sensibili alle dimensioni e alla velocità, la generazione del codice del tempo di collegamento è l'unico modo per andare comunque. –