Il punto di AddMemoryPressure è di dire al garbage collector che c'è una grande quantità di memoria allocata con quell'oggetto. Se non è gestito, il garbage collector non lo sa; solo la parte gestita. Dato che la porzione gestita è relativamente piccola, il GC potrebbe lasciarlo passare più volte per la raccolta dei dati inutili, essenzialmente sprecando memoria che potrebbe dover essere liberata.
Sì, è ancora necessario allocare manualmente e deallocare la memoria non gestita. Non puoi andartene da quello. Basta usare AddMemoryPressure per assicurarsi che il GC sappia che è lì.
Edit:
Ebbene, nel caso in cui uno, ho potuto farlo, ma sarebbe fare grande differenza, come il GC non sarebbe in grado di fare una cosa per il mio tipo , se ho capito bene: 1) dichiarerei la mia variabile, 8 byte gestiti, 2mb byte non gestiti. Lo userei poi, chiamerei dispose, quindi la memoria non gestita viene liberata. In questo momento si occuperà solo di 8 byte. Ora, ai miei occhi, avendo chiamato AddMemoryPressure all'inizio e RemoveMemoryPressure alla fine non avrei reso nulla di diverso. Cosa sto sbagliando? Mi dispiace per essere così entusiasta di questo. - Jorge Branco
Penso di vedere il tuo problema.
Sì, se è possibile garantire che si chiami sempre Dispose
, quindi sì, non è necessario preoccuparsi di AddMemoryPressure e RemoveMemoryPressure. Non c'è equivalenza, poiché il riferimento esiste ancora e il tipo non verrebbe mai raccolto.
Detto questo, si desidera comunque utilizzare AddMemoryPressure e RemoveMemoryPressure, per completezza. Cosa succede se, ad esempio, l'utente della tua classe ha dimenticato di chiamare Dispose?In tal caso, supponendo che tu abbia implementato correttamente il modello di Smaltimento, finirai per reclamare i tuoi byte non gestiti al momento della finalizzazione, cioè quando l'oggetto gestito viene raccolto. In tal caso, si desidera che la pressione della memoria sia ancora attiva, in modo che l'oggetto abbia maggiori probabilità di essere recuperato.
Beh, questo non ha risposto alla domanda, lol. –
Ho detto quasi esattamente quello che ha detto Steven Lyons, solo in un modo diverso. Come non ha risposto alla domanda? – Randolpho
Beh, in realtà l'ho riletto e modificato il mio post. –