Sto sviluppando un gioco utilizzando XNA e C# e stavo tentando di evitare di chiamare il codice di tipo new struct()
ogni fotogramma come pensavo che avrebbe fatto impazzire il GC. "Aspetta," mi sono detto, "struct è un tipo di valore, quindi il GC non dovrebbe essere chiamato, giusto?" Bene, è per questo che sto chiedendo qui.Cosa succede quando vengono creati i tipi di valore?
Ho solo un'idea molto vaga di cosa succede ai tipi di valore. Se creo una nuova struttura all'interno di una chiamata di funzione, la struttura viene creata nello stack? Sarà semplicemente spinto e fatto scoppiare e le prestazioni non saranno un successo? Inoltre, ci sarebbero limiti di memoria o implicazioni sul rendimento se, per esempio, ho bisogno di creare molte istanze in una singola chiamata?
Prendete, per esempio, questo codice:
spriteBatch.Draw(tex, new Rectangle(x, y, width, height), Color.White);
rettangolo in questo caso è una struct. Cosa succede quando viene creato quel nuovo rettangolo? Quali sono le implicazioni di dover ripetere quella linea molte volte (per esempio migliaia di volte)? Viene creato questo rettangolo, una copia inviata al metodo Draw e quindi scartata (il che significa che nessuna memoria viene mangiata più Draw viene chiamato in quel modo nella stessa funzione)?
P.S. So che potrebbe essere un'ottimizzazione pre-matura, ma sono per lo più curioso e desidero avere una migliore comprensione di ciò che sta accadendo.
Se chiamo ripetutamente la stessa funzione, un nuovo rettangolo ha spinto ogni chiamata a disegnare, ed è spuntato quando Draw ritorna? – Bob
Sì, ma tenete presente che premendo e scoppiando fotogrammi di stack è solo incrementando/decrementando un puntatore (una singola istruzione macchina). E il compilatore JIT ottimizzerà tutto per il regno venire comunque. – thecoop
@Bob: Sì, anche se immagino sia possibile - in teoria - che JIT * possa * vedere chiamate identiche e memorizzare il valore in cache per inviarlo più volte, ma ciò sembra altamente improbabile data l'euristica che sarebbe coinvolta nel rilevamento di questo e potrebbe essere facilmente escluso. –