C#中的原始布尔大小

32 c# boolean

C#中的布尔变量如何存储在内存中?也就是说,它们是作为一个字节存储而其他7位是否被浪费,或者,在数组的情况下,它们是否被分组为1字节的布尔块?

这回答了关于Java的相同问题(为什么没有定义Java的布尔基元大小?).Java和C#在这方面是一样的吗?

Mar*_*ell 32

在C#中,默认情况下这些不会打包,因此多个bool 字段将占用1个字节.您可以使用BitVector32,BitArray或简单地按位运算来减少此开销.作为变量,我似乎记得他们需要4个字节(基本上处理为int= Int32).

例如,以下设置i为4:

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

  • 请注意,尝试优化这些东西很可能为时过早.除非您主要使用大量布尔数据,否则它们不会成为任何内存问题的原因. (8认同)
  • @Andrew 坦率地说,`Marshal` 返回的内容在很大程度上是无关的。除非您实际上正在使用封送处理,否则。 (3认同)
  • @mireazma 如果您正在处理状态标志,则最好的选择是标志枚举 - 然后它们将在位级别打包 (2认同)
  • 4 个 bool 使用 16 个字节与结构体的包大小有关。如果你使用 `[StructLayout(LayoutKind.Sequential, Pack = 1)]` 它应该被打包成 4 个字节...... (2认同)

Sti*_*gar 19

在C#中,它们在数组或字段中存储为1个字节,但有趣的是,当它们是局部变量时,它们是4个字节.我相信bool的1字节是在.NET文档中的某个地方定义的,与Java不同.我想局部变量的4个字节的原因是为了避免在寄存器中读取32位时屏蔽这些位.sizeof运算符仍显示1个字节,因为这是唯一相关的大小,其他所有内容都是实现细节.