为什么布尔占用4个字节和char2字节。净框架?布尔应该采取多达1位或至少能较小,比char。

有帮助吗?

解决方案

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

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

其他提示

关于 boolean

大多数其他的答案得到错误的取向和速度是为什么一个程序员,应该坚持int for循环计数器,不为什么要编译器可以使一个字节将4-字节的宽。所有您的推理,事实上,适用于字节和短以及布尔。

C#至少,bool(或系统。Boolean)是1-byte广泛的内部结构,其中可以自动装箱的,因此你有一个对象(其需要两个词的代表,在非常少,即8/16字节32/64位的环境下分别)与外地(至少一个字节)加上一个存储器字点,即在总共至少13/25字节。

这就是事实上的第1谷歌上的条目"C#原始的类型"。http://msdn.microsoft.com/en-us/library/ms228360(VS。80).aspx

也引用的链路(http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx)还指出,布尔,由CLI标准,需要1个字节。

但是,实际上,唯一的地方,这是明显可见的是对阵列的布尔-n布尔会采取n字节。在其他情况下,一个布尔可以采用4个字节。

  • 内部结构,大多数运行时(也在Java)将调整所有领域的4个字节的边界的性能。蒙特JVM嵌入式设备是明智的-我猜它重新排序领域以最佳方式。
    • 在当地的框架/操作数堆的解释,在大多数执行情况,为业绩,一堆项是一个存储器字的广泛(而且可能。净必须64位的广泛支持的双重和长,其中。净使用只是1堆项,而不是2Java)。JIT编译器而是可以使用1byte布尔当地,同时保持其他变量结盟,通过重新排序的领域没有性能的影响,如果额外的开销是值得的。

关于 char

char 两个字节,因为当支持国际化是必需的,使用两个字节的内部是最安全的赌注。这不是直接相关的选择,以支持Unicode,但选择坚持UTF-16和基本多语种飞机。在爪哇和C#你可以假设所有的时间,一个逻辑char适合一个可变的种类型炭。

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

无论内存存储的细微差别如何,对于开发人员(包括您自己,一年后必须重新访问代码时)使用布尔值来表示真/假是/否值非常重要,因为它更准确地反映了您的意图。让代码更容易理解比保存两个字节重要得多。

使您的代码更准确地反映您的意图也降低了某些编译器优化会产生负面影响的可能性。这个建议超越了平台和编译器。

您还应该使用布尔值来帮助编写可维护的代码。如果我看一下代码,看到某个东西是一个布尔值就更值得节省内存,以确定你使用char作为布尔值。

我发现了这个:“实际上,布尔值是4个字节,而不是2.原因是这就是CLR支持的布尔值。我认为这就是它的作用,因为32位值的操作效率要高得多,因此时间/空间权衡通常是值得的。如果你需要将一堆比特塞在一起,你应该使用位向量类(忘记它的位置)......“

由Paul Wick在 http://geekswithblogs.net /cwilliams/archive/2005/09/18/54271.aspx

首先,您应该使用分析器来确定您在哪里遇到内存问题,恕我直言。

如果您有大量的位,则只关注内存,在这种情况下,您可以使用System.Collections.BitArray类。

因为Windows和.Net使用了 Unicode (UTF 16)从一开始就作为其内部字符集。 UTF 16 每个字符使用2个字节或每个字符使用一对2字节字,但仅限如果需要,因为它是可变宽度编码

"对于基本多语言平面(BMP)中的字符,生成的编码是单个16位字。对于其他平面中的字符,编码将产生一对16位字“

我对布尔值的猜测是它们是四个字节,因为默认寄存器是32位,这将是最小大小.Net可以有效地进行逻辑运算,除非使用按位运算。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top