为什么布尔在.NET框架中消耗4个字节和2个字节?布尔值应占用1位或至少小于char.
这是一个记忆对齐的问题.4字节变量的工作速度比2字节变量快.这就是为什么你应该使用int而不是字节或短的计数器等.
只有当内存比速度更重要时,才应使用2字节变量.这就是为什么char(在.NET中是Unicode)占用两个字节而不是四个字节的原因.
关于 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类型的变量.
这是因为在32位环境中,CPU可以比8位或16位值更快地处理32位值,因此这是速度/大小权衡.如果你必须节省内存并且你有大量的bool,只需使用uint并将你的布尔值保存为4字节uint的位.字符宽度为2个字节,因为它们存储16位Unicode字符.