Alcune persone non sanno che è possible to pass and return structs by value in C. La mia domanda riguarda il compilatore che esegue copie non necessarie quando restituisce le strutture in C. I compilatori C come GCC usano l'ottimizzazione Return value optimization(RVO) o si tratta di un concetto solo C++? Tutto ciò che ho letto su RVO e su copia elision riguarda il C++.Ottimizzazione del valore di ritorno e copia elisione in C
Consideriamo un esempio. Attualmente sto implementando uno double-double data type in C (o meglio float-float per iniziare perché trovo semplice test dell'unità). Considera il seguente codice.
typedef struct {
float hi;
float lo;
} doublefloat;
doublefloat quick_two_sum(float a, float b) {
float s = a + b;
float e = b - (s - a);
return (doublefloat){s, e};
}
Sarà il compilatore fare una copia temporanea del valore doublefloat
torno oppure può essere la copia temporanea eliso?
E l'ottimizzazione del valore di ritorno con nome (NRVO) in C? Ho un'altra funzione
doublefloat df64_add(doublefloat a, doublefloat b) {
doublefloat s, t;
s = two_sum(a.hi, b.hi);
t = two_sum(a.lo, b.lo);
s.lo += t.hi;
s = quick_two_sum(s.hi, s.lo);
s.lo += t.lo;
s = quick_two_sum(s.hi, s.lo);
return s;
}
In questo caso sto restituendo una struttura denominata. È possibile elidere la copia temporanea in questo caso?
Si dovrebbe affermare che questa è una domanda generale per C e che gli esempi di codice che ho usato qui sono solo degli esempi (quando ottimizzo questo userò comunque SIMD con intrinseco). Sono consapevole che potrei guardare l'output dell'assembly per vedere cosa fa il compilatore, ma penso che sia comunque una domanda interessante.
@BaummitAugen, non ero sicuro se avrei dovuto usare il tag C++. Ma penso di aver chiarito nella mia domanda che si tratta di C. Speravo che il tag C++ attirasse persone esperte in entrambe le lingue. –
@BaummitAugen c'è un tale concetto in C. Ho rimosso il tag 'C' come mi sembra erreano. –
@IvayloStrandjev la domanda riguarda C, il tag si applica alla domanda, no? – BeyelerStudios