2010-12-05 59 views
6

我读了一本关于C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)和我刚读这一段:字节变量如何存储在内存中?

更改基础类型的 列举的可以是有益的,如果你是 构建.NET应用程序,将 被部署到低内存设备 (例如启用.NET的手机或PDA),并且需要尽可能节省内存 。

确实字节使用较少的内存?性能方面的原因,它们不存储在4字节?我记得在某处读了后者,但我找不到任何有关它的信息,即使在C#规范中也没有。

回答

7

这并不简单。由于变量在一个方法中,它们几乎与int相同,所以4字节;在一个数组内,它们是单字节的。作为一个领域...我需要检查; I 猜测填充意味着它们可能被视为4字节。一个structsizeof应揭露...

struct Foo { 
    byte a, b, c; 
} 
static class Program { 
    unsafe static void Main() { 
     int i = sizeof(Foo); // <==== i=3 
    } 
} 

这里i显示了3个,所以它们是单字节的字段,但(见codymanix评论)可能需要额外的填充,当其他类型的参与 - 为例如:

struct Foo 
{ 
    byte a, b, c; 
    int d; 
} 

是字节,由于需要的d对齐。趣味有趣的乐趣。

+0

谢谢!这很有趣。 – neo2862 2010-12-05 11:13:06

1

字节不需要对齐即可在x86 CPU上高效工作(尽管如此,大型设备也可以)。对于其他CPU架构,情况可能会有所不同。

2

我认为这取决于目标平台。在“低内存”设备上,CLR可能选择将它们打包紧密,所以如果更改枚举类型,它将节省内存。

2

我不认为这是由C#甚至.NET规范明确定义的。您应该使用StructLayout and FieldOffset attributes来指定确切的内存布局。

[StructLayout(LayoutKind.Sequential, Pack=1)] 
struct TestDByte 
{ 
    public double a; 
    public byte b; 
}