2010-12-05 28 views
6

Je lis un livre sur C# (Pro C# and the .NET 4 Platform by Andrew Troelsen) et je viens de vous lire ce paragraphe:Comment les variables d'octets sont-elles stockées en mémoire?

Modification du type sous-jacent d'une énumération peut être utile si vous êtes la construction d'une application .NET qui va être déployés sur un périphérique à mémoire faible (tel qu'un téléphone cellulaire compatible .NET ou un PDA ) et doivent conserver la mémoire dans la mesure du possible.

Est-il vrai que les octets utilisent moins de mémoire? Ne sont-ils pas stockés sur 4 octets pour des raisons de performances? Je me souviens avoir lu ce dernier quelque part mais je ne trouve aucune information à ce sujet, même pas dans la spécification C#.

Répondre

7

Ce n'est pas simple. En tant que variables dans une méthode, ils sont à peu près les mêmes que int, donc 4 octets; à l'intérieur d'un tableau, ils sont mono-octets. En tant que domaine ... je devrais vérifier; I supposer signifie qu'ils peuvent être traités comme 4 octets. A struct avec sizeof devrait révéler ...

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

Ici i montre 3, donc ils sont un seul octet comme des champs, mais (voir commentaires par codymanix) un rembourrage supplémentaire peut être nécessaire lorsque d'autres types Engagez-vous - pour exemple:

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

est octets, en raison de la nécessité de d à aligner. Fun amusant amusant.

+0

Merci! C'est très intéressant. – neo2862

+4

Mais ce sera différent si vous avez struct Foo {byte a; int b; } Puisque b est un entier, il doit être aligné, de sorte qu'un remplissage supplémentaire est inséré. – codymanix

+0

@ neo2862 - voir le point ci-dessus; intéressant. –

1

Les octets n'ont pas besoin d'être alignés pour fonctionner efficacement sur les processeurs x86 (cependant, les unités plus grandes le font). Pour d'autres architectures de CPU, les choses peuvent fonctionner différemment.

2

Je pense que cela dépend de la plate-forme cible. Sur les périphériques "low-memory", le CLR peut choisir de les compresser étroitement, ce qui économisera de la mémoire si vous changez le type d'énumération.

2

Je ne pense pas que cela soit explicitement défini par la spécification C# ou même .NET. Vous devez utiliser le StructLayout and FieldOffset attributes pour spécifier la mise en page exacte de la mémoire.

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