Domanda

Qualcuno ha mai effettivamente utilizzato stackalloc mentre la programmazione in C #? Sono consapevole di ciò che viene fa, ma l'unica volta che si presenta nel mio codice è un caso, perché Intellisense suggerisce che quando si digita static, per esempio.

Anche se non è legato agli scenari di utilizzo di stackalloc, Io in realtà una notevole quantità di eredità di interoperabilità tra le mie applicazioni, così ogni tanto ho potuto ricorrere all'utilizzo di codice unsafe. Ma tuttavia solito trovo modi per evitare unsafe completamente.

E poiché dimensione dello stack per un singolo thread in .Net è ~ 1Mb (correggetemi se sbaglio), sono ancora più riservata di utilizzare stackalloc.

Ci sono alcuni casi pratici in cui si potrebbe dire:? "Questo è esattamente la giusta quantità di dati e di elaborazione per me di andare sicuri e utilizzare stackalloc"

È stato utile?

Soluzione

L'unica ragione per usare stackalloc è la prestazione (sia per calcoli o interoperabilità). Utilizzando stackalloc invece di un array heap allocata, si crea meno pressione GC (GC deve essere eseguito in meno), non è necessario al pin array giù, è più veloce allocare di una matrice mucchio, una viene liberato automaticamente metodo exit (heap allocata matrici si rilasciano solo quando viene eseguito GC). Anche utilizzando stackalloc al posto di un allocatore nativa (come malloc o equivalente Net) si guadagna anche la velocità e la deallocazione automatica in uscita campo di applicazione.

Performance saggio, se si utilizza stackalloc si aumenta notevolmente la possibilità di cache di visite per la CPU a causa della località di dati.

Altri suggerimenti

Ho usato stackalloc per allocare i buffer per [vicino] opera in tempo reale DSP. E 'stato un caso molto specifico in cui le prestazioni necessarie per essere il più coerente possibile. Nota c'è una differenza tra la consistenza e il throughput complessivo - in questo caso non riguardava le allocazioni di heap di essere troppo lento, solo con la non determinismo della raccolta dei rifiuti a quel punto del programma. Io non lo uso nel 99% dei casi.

stackalloc è rilevante solo per il codice non sicuro. Per il codice gestito non è possibile decidere dove allocare i dati. tipi di valore sono allocati sullo stack predefinito (a meno che non fanno parte di un tipo di riferimento, nel qual caso essi sono allocati in mucchio). I tipi di riferimento sono allocati sul mucchio.

La dimensione dello stack predefinita per un'applicazione semplice .NET vaniglia è 1 MB, ma è possibile modificare questa nell'intestazione PE. Se stai iniziando le discussioni in modo esplicito, si può anche impostare una diversa dimensione via del sovraccarico del costruttore. Per le applicazioni ASP.NET la dimensione dello stack di default è solo 256K, che è qualcosa da tenere a mente se stai passando tra i due ambienti.

stackalloc inizializzazione delle campate. Nelle precedenti versioni di C #, il risultato di stackalloc potrebbe essere memorizzato in una variabile locale puntatore solo. Come di C # 7.2, stackalloc può ora essere utilizzato come parte di un'espressione e può avere come bersaglio un arco, e che può essere fatto senza utilizzare la parola chiave non sicuri. Così, invece di scrivere

Span<byte> bytes;
unsafe
{
  byte* tmp = stackalloc byte[length];
  bytes = new Span<byte>(tmp, length);
}

È possibile scrivere semplicemente:

Span<byte> bytes = stackalloc byte[length];

Questo è anche estremamente utile in situazioni in cui è necessario un po 'di spazio zero per eseguire un'operazione, ma si vuole evitare l'allocazione di memoria heap per dimensioni relativamente piccole

Span<byte> bytes = length <= 128 ? stackalloc byte[length] : new byte[length];
... // Code that operates on the Span<byte>

Fonte: C # - All About Span: Exploring un nuovo .NET Mainstay

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top