Pourquoi un System.Boolean prend 4 octets? Il stocke simplement un état, soit vrai ou faux, qui pourrait être stocké dans moins d'espace que 4 octets.Pourquoi un booléen de 4 octets dans .NET?
Répondre
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.
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.
tactile de Nice avec l'URL :) première réponse de Google est aujourd'hui – Tom
cette question. Puisque les questions sont archivées, veuillez ajouter le lien spécifique dans le futur. – Blaisorblade
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
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.
Je pense que c'est seulement pour la performance, les valeurs de 32 bits sont beaucoup plus efficaces à manipuler.
Où avez-vous trouvé cela? System.Boolean ne prend que octet.
Juste essayer:
Console.WriteLine(sizeof(System.Boolean).ToString());
Vérifiez la taille après le marshaled du type: Console.Write (System.Runtime.InteropServices.Marshal.SizeOf (new System.Boolean())); – CMS
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
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
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());
}
- 1. Quel type pour un entier de plus de 4 octets?
- 2. sql server 4 octets unsigned int
- 3. Cast int à byte [4] dans .NET
- 4. Pourquoi ET deux nombres pour obtenir un booléen?
- 5. Comment saisir des caractères UTF-8 de 4 octets?
- 6. Utilisation de log4net dans .net petshop 4
- 7. Pourquoi une mémoire adressable par octet et pas une mémoire adressable sur 4 octets?
- 8. FTP ne pas télécharger les 4 derniers octets
- 9. Dans csh, pourquoi 4 - 3 + 1 == 0?
- 10. Modification AJAX dans .NET 4: Sys.Services.AuthenticationService
- 11. Pourquoi TADOBlobField.Savetofile n'écrit que 8 octets
- 12. Pourquoi Guid.ToString() inverse l'ordre des octets?
- 13. ASP.NET - Un moyen facile d'échanger un booléen?
- 14. Grille de propriétés .NET - setting Browsable (booléen) utilisant App.config
- 15. Construction de projets .NET 4 avec Nant
- 16. Pourquoi utiliser un fichier ".pfx" dans .NET
- 17. C# 4 mot-clé dynamique - pourquoi pas?
- 18. Écrire un entier de 2 octets dans un flux?
- 19. bits de dumping/octets dans un fichier en mode binaire
- 20. 3 octets UTF-8 Chaîne de remplacement en .NET (Convertir 3 octets UTF-8 en chaîne ou Char)
- 21. Comment pouvez-vous avoir un type booléen dans VP-uml?
- 22. Pourquoi la taille de la classe avec une fonction membre est de 1 octet ... Alors que la fonction membre est de 4 octets
- 23. Malloc de 2 octets donne des problèmes
- 24. Liaison conditionnelle de premier plan à un booléen
- 25. Dossiers dans umbraco 4
- 26. (sockets réseau) octets bloqués dans la file d'attente d'envoi pendant 15 minutes; Pourquoi?
- 27. Nouvelles fonctionnalités de WPF 4?
- 28. Comment puis-je obtenir un DataMemberAttribute utiliser un type booléen
- 29. Cryptage DES de 8 octets en texte brut résultats dans le tableau de 16 octets
- 30. Comment désactiver le Forum dans DNN 4?
Même Nullable utilisera seulement deux octets dans certains cas - par exemple si vous en avez un tableau. –
Oui, vous avez raison. Je m'attendais à aligner les indices de tableau pour des raisons de performance, mais cela ne semble pas le cas. –
+1, vous répondez est si bon que d'autres utilisateurs le volent. – Will