C# C语言中的本原布尔大小#

C# C语言中的本原布尔大小#,c#,boolean,C#,Boolean,C#中的布尔变量如何存储在内存中?也就是说,它们是否存储为一个字节而其他7位被浪费,或者,在数组的情况下,它们是否分组为1字节的布尔块 这回答了关于Java()的相同问题。Java和C在这方面是一样的吗?在C中,它们在数组或字段中存储为1字节,但有趣的是,当它们是局部变量时,它们是4字节。我相信bool的1字节是在.NET文档中定义的,与Java不同。我认为本地变量使用4字节的原因是为了避免在寄存器中读取32位时屏蔽位。sizeof运算符仍然显示1字节,因为这是唯一相关的大小,其他所有内容都是实

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

这回答了关于Java()的相同问题。Java和C在这方面是一样的吗?

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

在C#中,默认情况下肯定不会压缩位,因此多个布尔字段将每个占用1字节。您可以使用
位向量32
位数组
,或简单的按位运算来减少此开销。作为变量,我似乎记得它们需要4个字节(基本上被处理为
int
=
Int32

例如,以下将
i
设置为4:

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

请注意,尝试优化这些内容很可能为时过早。除非您主要对大量布尔数据进行操作,否则它们不会导致任何内存问题。但是如果您将
Marshal.SizeOf
Foo
实例一起使用,它将返回16,无论是类成员还是局部变量(根据Stillgar的回答)。@Andrew what
Marshal
返回的基本上是无关的,坦白地说除非您实际使用封送处理,也就是说。@mireazma如果您处理的是状态标志,最好的选择是标志枚举-然后它们将在位级别进行打包,4 bool使用16字节与结构的打包大小相关。如果使用
[StructLayout(LayoutKind.Sequential,Pack=1)]
则应将其压缩为4个字节…一个浮点?以浮点和bool的形式存储,在本例中bool的结尾也是4个字节(float?需要8个字节,而float需要4个字节)。在这种情况下,它可能会将布尔值与4字节对齐,因为它与数组中的浮点值配对。@John,你是如何测量
浮点值的?
的大小的?我不能使用
sizeof
Marshal.sizeof
返回4。我创建了一个float?[]和一个float[]。在每个步骤之前和之后,我调用了GC.getTotalMemy()。如果在GetTotalMemory调用之前调用GC.Collect(),您将看到分配所消耗的实际内存量,包括任何对齐,而不仅仅是数据元素本身的大小。关于“和其他7位被浪费”-是的。尽管这取决于语言如何浪费它们:C#value
true
用零浪费7个额外的位,而VB.NET value
true
用1浪费它们(尽管你永远不必知道,.NET将所有非零的都视为true).我从上面收回我的陈述:当我编写一个类型来演示该行为时,我发现VB.NET当前(.NET 4.8)也只为
true
设置了最低位。(我没有进一步调查这一行为是否与过去有所不同,或者我是否完全错了——如果您了解更多,请随时发表评论)。“.NET将所有非零视为真”的声明“我可以通过测试来确认。