39 votes

Taille booléenne primitive en C#

Comment les variables booléennes en C# sont-elles stockées en mémoire ? En d'autres termes, sont-elles stockées sous la forme d'un octet, les 7 autres bits étant gaspillés, ou, dans le cas des tableaux, sont-elles regroupées en blocs d'un octet de booléens ?

Ceci répond à la même question concernant Java ( Pourquoi la taille de la primitive booléenne de Java n'est-elle pas définie ? ). Java et C# sont-ils identiques à cet égard ?

37voto

Marc Gravell Points 482669

En C#, il est certain que l'option bits ne sont pas emballées par défaut, donc plusieurs bool champs prendront chacun 1 octet. Vous pouvez utiliser BitVector32 , BitArray ou simplement l'arithmétique bit à bit pour réduire ce surcoût. En tant que variables Je crois me souvenir qu'ils prennent 4 octets (essentiellement traités comme des int = Int32 ).

Par exemple, les ensembles suivants i à 4 :

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

20voto

Stilgar Points 8165

En C#, ils sont stockés sur 1 octet dans un tableau ou un champ, mais il est intéressant de noter qu'ils sont sur 4 octets lorsqu'il s'agit de variables locales. Je crois que le fait que les bool soient des variables à 1 octet est défini quelque part dans la documentation .NET, contrairement à Java. Je suppose que la raison des 4 octets pour les variables locales est d'éviter de masquer les bits lors de la lecture de 32 bits dans un registre. Toujours est-il que l'opérateur sizeof affiche 1 octet parce que c'est la seule taille pertinente et que tout le reste est un détail d'implémentation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X