consideri un metodo che restituisce una struttura, come questo:In che modo .NET ottimizzano i metodi che restituiscono un valore di Struttura?
Public Function DoWork() As MyStructure
Return New MyStructure(1.5, 1.7, 1.1, 55.9)
End Function
In questo caso, non .NET creare e inizializzare un valore MyStructure
volta, o due volte ?
MODIFICA: La mia impressione è che una chiamata a DoWork
deve coinvolgere .NET che spinge il valore di ritorno in pila fin dall'inizio. Altrimenti, in che modo Return
restituisce qualcosa al codice chiamante? Quindi questa è la prima inizializzazione di cui sto parlando.
La seconda inizializzazione sarebbe al Return
dichiarazione, in cui gli argomenti 1.5, 1.7, 1.1, 55.9 inizializzare un nuovo valore MyStructure
. Su Return
, .NET quindi sovrascrivere il valore esistente nello Stack con il nuovo valore restituito.
Il fatto è che so ben poco di come .NET funzioni sotto il cofano. La mia idea di come funziona Stacks si basa su vaghi ricordi del tentativo di codificare in Pascal, sotto DOS, nei primi anni '90. Non ho idea di come .NET/Windows funzioni in questi giorni!
Ho testato di recente entrambe le JIT per evitare le copie della struttura. Non ho verificato i ritorni di funzione, li ho dimenticati. Ma all'interno di un metodo quasi tutto ciò che riguarda le strutture viene tradotto letteralmente mentre lo scrivi. Evitamento della copia molto piccolo anche in casi ovvi. Quindi non ti illudere, non molte ottimizzazioni nei JIT .NET. – usr
Se fosse due volte, quale sarebbe la seconda volta (dopo il 'New')? –
@JohnSaunders forse il risultato del nuovo viene prima scritto in una nuova posizione dello stack e solo allora il ritorno verrebbe eseguito copiando il valore temporaneo nel percorso del valore di ritorno. Penso che sarebbe quello che farebbe un JIT non ottimizzante naturalmente. – usr