当前位置:  开发笔记 > 编程语言 > 正文

为什么布尔值比char消耗更多的内存?

如何解决《为什么布尔值比char消耗更多的内存?》经验,为你挑选了3个好方法。

为什么布尔在.NET框架中消耗4个字节和2个字节?布尔值应占用1位或至少小于char.



1> Gorpik..:

这是一个记忆对齐的问题.4字节变量的工作速度比2字节变量快.这就是为什么你应该使用int而不是字节或短的计数器等.

只有当内存比速度更重要时,才应使用2字节变量.这就是为什么char(在.NET中是Unicode)占用两个字节而不是四个字节的原因.


您通常无法使用标准体系结构引用单个内存位,这样做效率非常低.字节通常是最小的可寻址单元,在这种情况下,正在考虑一个2字节的字符.
未装箱的布尔值需要1个字节 - 见下文; 这根本不是问题的有效答案.

2> Blaisorblade..:

关于 boolean

大多数其他答案都是错误的 - 对齐和速度是程序员应该坚持使用int for循环计数器的原因,而不是为什么编译器可以使一个字节为4字节宽.事实上,所有的推理都适用于字节和短路以及布尔值.

至少在C#中,bool(或System.Boolean)是一个1字节宽的内置结构,可以自动装箱,所以你有一个对象(至少需要两个记忆词,即8 /分别在32/64位环境上的16个字节),其中一个字段(至少一个字节)加上一个指向它的存储器字,即总共至少13/25字节.

这确实是"C#原始类型"的第一个Google条目. http://msdn.microsoft.com/en-us/library/ms228360(VS.80).aspx

此外,引用的链接(http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx)还指出,CLI标准的布尔值占用1个字节.

然而,实际上,唯一可以看到它的地方是布尔数组 - 布尔值将占用n个字节.在其他情况下,一个布尔值可能需要4个字节.

在结构内部,大多数运行时(也在Java中)会将所有字段与4字节边界对齐以提高性能.用于嵌入式设备的Monty JVM更明智 - 我想它可以最佳地重新排序字段.

在解释器的本地帧/操作数堆栈上,在大多数实现中,为了提高性能,一个堆栈条目是一个内存字宽(并且在.NET上它必须是64位宽才能支持double和long,这在.NET上在Java中只使用1个堆栈条目而不是2个).JIT编译器可以使用1个字节作为布尔本地,同时通过重新排序字段来保持其他变量对齐,而不会影响性能,如果额外的开销是值得的.

关于 char

char是两个字节,因为当需要支持国际化时,在内部使用双字节字符是最安全的选择.这与选择支持Unicode无关,而是与坚持UTF-16和基本多语言平面的选择无关.在Java和C#中,您可以假设一个逻辑char适合char类型的变量.



3> Tamas Czineg..:

这是因为在32位环境中,CPU可以比8位或16位值更快地处理32位值,因此这是速度/大小权衡.如果你必须节省内存并且你有大量的bool,只需使用uint并将你的布尔值保存为4字节uint的位.字符宽度为2个字节,因为它们存储16位Unicode字符.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有