Quello che ho capito è che questo non dovrebbe essere fatto, ma credo che ho visto esempi che fanno qualcosa di simile (codice di nota non è necessariamente sintatticamente corretto, ma l'idea c'è)È sicuro restituire una struct in C o C++?
typedef struct{
int a,b;
}mystruct;
E poi ecco una funzione
mystruct func(int c, int d){
mystruct retval;
retval.a = c;
retval.b = d;
return retval;
}
ho capito che dovremmo sempre restituire un puntatore ad una struct malloc'ed se vogliamo fare qualcosa di simile, ma sono sicuro che ho visto esempi che fare qualcosa di simile. È corretto? Personalmente restituisco sempre un puntatore a una struttura mallocita o eseguo semplicemente un passaggio facendo riferimento alla funzione e modificando i valori lì. (Perché la mia comprensione è che una volta che l'ambito della funzione è finito, qualsiasi stack è stato usato per allocare la struttura può essere sovrascritto).
Aggiungiamo una seconda parte alla domanda: varia dal compilatore? In caso affermativo, qual è il comportamento delle ultime versioni di compilatori per desktop: gcc, g ++ e Visual Studio?
Riflessioni sulla questione?
"Quello che capisco è che questo non dovrebbe essere fatto", dice chi? Lo sto facendo tutto il tempo. Si noti inoltre che typedef non è necessario in C++ e che non esiste qualcosa come "C/C++". – PlasmaHH
La domanda sembra ** non ** essere indirizzata a C++. –
@PlasmaHH La copia di strutture di grandi dimensioni può risultare inefficiente. Ecco perché bisogna fare attenzione e riflettere seriamente prima di restituire una struttura in base al valore, specialmente se la struttura ha un costoso costruttore di copie e il compilatore non è adatto all'ottimizzazione del valore di ritorno. Recentemente ho apportato un'ottimizzazione a un'app che stava spendendo una parte significativa del suo tempo nei costruttori di copie per alcune grandi strutture che un programmatore aveva deciso di restituire di valore in tutto il mondo. L'inefficienza ci costava circa $ 800.000 nell'hardware del datacenter aggiuntivo che dovevamo acquistare. – Crashworks