2008-11-17 11 views

Répondre

50

A bool est en fait seulement 1 octet, mais l'alignement peut entraîner des 4 octets à être utilisé sur une plate-forme 32 bits, ou même 8 octets sur une plate-forme 64 bits. Par exemple, le type Nullable<bool> (alias bool?) utilise 32 ou 64 bits en fonction de la plate-forme, même s'il ne comprend que deux bool s. EDIT: Comme indiqué par Jon Skeet, rembourrage pour l'alignement n'est pas toujours présent. À titre d'exemple, un tableau de Nullable<bool> s ne prend que 2 octets par objet au lieu de 4 ou 8.

Mais même 8 bits pour représenter un bool peut être considéré comme un gaspillage si vous avez beaucoup d'entre eux à stocker. Pour cette raison, si vous créez un type ayant beaucoup de bool s comme membres (ou utilise plusieurs types Nullable<>), et les utilisateurs de votre classe peuvent en créer plusieurs instances, vous pouvez envisager d'utiliser un BitVector32 à la place. Le cadre lui-même utilise cette technique pour réduire l'empreinte mémoire de la plupart des contrôles Windows Forms, par exemple.

+3

Même Nullable utilisera seulement deux octets dans certains cas - par exemple si vous en avez un tableau. –

+0

Oui, vous avez raison. Je m'attendais à aligner les indices de tableau pour des raisons de performance, mais cela ne semble pas le cas. –

+2

+1, vous répondez est si bon que d'autres utilisateurs le volent. – Will

6

Le premier résultat d'une recherche Google pour System.Boolean size m'a indiqué que cela concernait l'alignement de la mémoire. Il est plus rapide de contourner un Int32 de quatre octets que de travailler avec des octets/bits individuels.

+0

tactile de Nice avec l'URL :) première réponse de Google est aujourd'hui – Tom

+4

cette question. Puisque les questions sont archivées, veuillez ajouter le lien spécifique dans le futur. – Blaisorblade

+0

La seule raison pour laquelle je n'ai pas fait de recherche sur google est qu'il me renvoyait à la même page de stackoverflow;) – Sun

13

Parce que c'est rapide.

Un processeur 32 bits fonctionne généralement avec des valeurs de 32 bits. Travailler avec des valeurs plus petites implique des instructions plus longues ou une logique supplémentaire.

1

Je pense que c'est seulement pour la performance, les valeurs de 32 bits sont beaucoup plus efficaces à manipuler.

1

Où avez-vous trouvé cela? System.Boolean ne prend que octet.

Juste essayer:

Console.WriteLine(sizeof(System.Boolean).ToString()); 
+0

Vérifiez la taille après le marshaled du type: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS

+0

Ce qui est ce que vous ne devriez pas faire. La plupart des API non gérées utilisent * int * pour les valeurs BOOL, Marhsal.SizeOf() vous indique la taille d'un type * non géré *. – arul

+0

Marshalling un bool est légèrement plus compliqué que cela. J'ai fait un post de blog sur ce sujet qui couvre les différentes tailles: http://blogs.msdn.com/jaredpar/archive/2008/10/14/pinvoke-and-bool-or-should-i-say-bool. aspx – JaredPar

0

J'ai utilisé le code suivant pour créer plusieurs tableaux et les tester. float? [100000] utilise deux fois plus de mémoire que float [100000]. C'est parce que le bool qui accompagne le flotteur dans le flotteur? le boîtier est aligné sur 32 bits (au moins sur ma machine ;-))

long startMem = 0, stopMem = 0; 
DateTime startTime = DateTime.Now; 
private void StartMemoryUsage() 
{ 
    GC.Collect(); 
    GC.Collect(); 
    startMem = GC.GetTotalMemory(true); 
    startTime = DateTime.Now; 
} 
private void StopMemoryUsage() 
{ 
    GC.Collect(); 
    GC.Collect(); 
    stopMem = GC.GetTotalMemory(true); 

    Console.WriteLine("---> {0} sec. Using {1} KB.", (DateTime.Now - startTime).TotalSeconds, ((stopMem - startMem)/1000).ToString()); 
} 
Questions connexes