Una domanda semplice, ma non ho trovato una risposta definitiva su Stack Overflow.Una struttura C# è mai stata inserita se usata come valore di ritorno di una funzione?
struct foo { int x; int y; int z; }
foo Func()
{
return new foo();
}
void Func2()
{
foo f = Func(); // did boxing and unboxing occur?
}
È un C# struct (tipo di valore) sempre copiati stack quando tornato da una funzione, non importa quanto grande potrebbe essere? Il motivo per cui non sono sicuro è che per alcuni set di istruzioni diversi da MSIL (come x86), un valore di ritorno di solito deve inserirsi in un registro del processore e lo stack non è direttamente coinvolto.
In tal caso, è il sito di chiamata che pre-alloca lo spazio sullo stack CLR per il tipo di valore restituito (previsto)?
[modifica: riassunto delle risposte:] Per l'intento della domanda originale, la risposta è no; il CLR non inserirà mai (silenziosamente) una struttura solo allo scopo di inviarlo come valore di ritorno.
@Brian: grazie, me ne rendo conto, ma penso che tu stia dicendo che il processo di restituirlo dalla funzione stessa non comporta alcuna boxe. Ho aggiornato il codice per rendere la domanda più chiara. –
Grande, grazie per le vostre risposte! –
Se un ritorno di un tipo di valore è mai (il tuo uso di "sempre" sembra implicare che a volte se accade, non è incondizionato), significa che c'è un unboxing implicito quando assegniamo il ritorno a una variabile di tipo valore, e sembra inefficiente. Non so praticamente nulla di MSIL e CLR quindi non posso aiutarti qui. Ad ogni modo, posso sapere che cosa ha spinto la tua domanda? – blizpasta