字节变量如何存储在内存中?

时间:2010-12-05 11:04:32

标签: c# memory byte

我正在读一本关于C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)的书,我刚读过这一段:

  

更改基础类型   如果你是枚举可能会有所帮助   构建一个.NET应用程序   被部署到低内存设备   (例如支持.NET的手机或   PDA)并需要节省内存   尽可能。

字节使用更少的内存是真的吗?出于性能原因,它们不是存储在4个字节上吗?我记得在某个地方读过后者,但我找不到任何关于它的信息,甚至在C#规范中都没有。

4 个答案:

答案 0 :(得分:7)

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

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对齐,

8 字节。有趣的乐趣。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

不需要对齐字节就可以在x86 CPU上有效工作(不过更大的单位)。对于其他CPU架构,事情可能会有所不同。