2010-02-22 15 views

risposta

14

In C# vengono memorizzati come 1 byte in un array o in un campo, ma sono interessanti 4 byte quando sono variabili locali. Credo che 1-byteness di bool sia definito da qualche parte nei documenti .NET a differenza di Java. Suppongo che il motivo per i 4 byte per le variabili locali sia evitare di mascherare i bit quando si leggono 32 bit in un registro. Ancora l'operatore sizeof mostra 1 byte perché questa è l'unica dimensione rilevante e tutto il resto è il dettaglio dell'implementazione.

+0

Un galleggiante? viene memorizzato come float e bool e anche in questo caso il bool ha 4 byte (float? accetta 8 byte contro 4 per un float). Forse allinea i bool a 4 byte in questo caso poiché è accoppiato con un float nell'array. – John

+0

@ John, come hai misurato la dimensione di 'float?' Non riesco a usare 'sizeof' e' Marshal.SizeOf' restituisce 4. – Andrew

+0

Ho creato un float? [] E un float []. Prima e dopo ogni passaggio, ho chiamato GC.GetTotalMemory(). Se chiami GC.Collect() un paio di volte prima della chiamata GetTotalMemory, vedrai la quantità effettiva di memoria consumata dall'allocazione, inclusi eventuali allineamenti, non solo la dimensione dell'elemento di dati stesso. – John

24

In C#, certamente i bit non imballate per impostazione predefinita, in modo bool multipla campi sarà ogni prendere 1 byte. È possibile utilizzare BitVector32, BitArray o semplicemente aritmetica bit a bit per ridurre questo sovraccarico. Come variabili Mi sembra di ricordare che prendono 4 byte (essenzialmente gestiti come int = Int32).

Ad esempio, i seguenti gruppi i a 4:

struct Foo 
{ 
    public bool A, B, C, D; 
} 
static unsafe void Main() 
{ 
    int i = sizeof(Foo); 
} 
+6

Nota che cercare di ottimizzare questa roba è molto probabilmente prematuro. A meno che non si operino principalmente su enormi quantità di dati booleani, questi non causeranno problemi di memoria. –

+0

Ma se si utilizza 'Marshal.SizeOf' con un'istanza di' Foo', restituisce 16, sia che si tratti di un membro della classe o di una variabile locale (come da risposta di Stilgar). – Andrew

+1

@Andrew ciò che 'Marshal' restituisce è in gran parte non correlato, francamente. A meno che non si stia effettivamente utilizzando il marshalling. –