C#中的布尔变量如何存储在内存中?也就是说,它们是存储为一个字节而其他7位是否被浪费,或者在数组的情况下,它们是否被分组为1字节的布尔块?
这回答了有关Java(Why is Java's boolean primitive size not defined?)的相同问题。 Java和C#在这方面是否相同?
答案 0 :(得分:31)
在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);
}
答案 1 :(得分:18)
在C#中,它们在数组或字段中存储为1个字节,但有趣的是,当它们是局部变量时,它们是4个字节。我相信bool的1字节是在.NET文档中的某个地方定义的,与Java不同。我想局部变量的4个字节的原因是为了避免在寄存器中读取32位时屏蔽这些位。 sizeof运算符仍显示1个字节,因为这是唯一相关的大小,其他所有内容都是实现细节。