2010-12-05 41 views
6

estoy leyendo un libro sobre C# (Pro C# and the .NET 4 Platform by Andrew Troelsen) y acabo de leer este párrafo:¿Cómo se almacenan las variables de bytes en la memoria?

Cambiar el tipo de subyacente de una enumeración puede ser útil si usted está construcción de una aplicación .NET que se se implemente en un dispositivo con poca memoria (como un teléfono celular habilitado para .NET o PDA) y necesite conservar la memoria siempre que sea posible.

¿Es verdad que los bytes usan menos memoria? ¿No están almacenados en 4 bytes por motivos de rendimiento? Recuerdo leer el último en algún lugar, pero no puedo encontrar ninguna información al respecto, ni siquiera en la especificación C#.

Respuesta

7

No es simple. Como variables en un método, son prácticamente lo mismo que int, entonces 4 bytes; dentro de una matriz son de un solo byte. Como campo ... Tendría que verificar; I Supongo que relleno significa que pueden tratarse como de 4 bytes. Unstruct con sizeof debe revelar ...

struct Foo { 
    byte a, b, c; 
} 
static class Program { 
    unsafe static void Main() { 
     int i = sizeof(Foo); // <==== i=3 
    } 
} 

Aquí i muestra 3, por lo que son de un solo byte como campos, pero (véanse los comentarios de codymanix) puede ser necesaria relleno adicional cuando otros tipos involucrarse - para ejemplo:

struct Foo 
{ 
    byte a, b, c; 
    int d; 
} 

es bytes, debido a la necesidad de d a alinearse. Diversión diversión diversión.

+0

¡Gracias! Esto es muy interesante. – neo2862

+4

Pero será diferente si tiene struct Foo {byte a; int b; }. Como b es int, necesita alinearse, por lo que se inserta un relleno adicional. – codymanix

+0

@ neo2862 - ver el punto anterior; interesante. –

1

No es necesario alinear los bytes para que funcionen de manera eficiente en las CPU x86 (aunque las unidades más grandes sí lo hacen). Para otras arquitecturas de CPU, las cosas pueden funcionar de manera diferente.

2

Creo que depende de la plataforma de destino. En dispositivos "con poca memoria", el CLR puede optar por empaquetarlos con fuerza, por lo que se ahorrará memoria si cambia el tipo de enumeración.

2

No creo que esto esté explícitamente definido por la especificación C# o incluso .NET. Debe usar StructLayout and FieldOffset attributes para especificar el diseño exacto de la memoria.

[StructLayout(LayoutKind.Sequential, Pack=1)] 
struct TestDByte 
{ 
    public double a; 
    public byte b; 
} 
Cuestiones relacionadas