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

7
我正在阅读一本关于C#的书籍(《Pro C# and the .NET 4 Platform》(第五版) by Andrew Troelsen),刚刚读到了这段话:
改变枚举的基础类型可以帮助你构建一个.NET应用程序并部署到低内存设备(例如.NET启用的手机或PDA),需要尽可能地节省内存。
字节确实使用更少的内存吗?它们不是因为性能原因而以4个字节的方式存储吗?我记得在某处读到过后一句话,但我找不到任何相关信息,甚至在C#规范中也找不到。
4个回答

8

这并不简单。在方法中作为变量时,它们与int几乎相同,所以是4字节;在数组内部它们是单字节的。作为字段...我需要检查;填充意味着它们可能被视为4字节,但我只是猜测。使用sizeofstruct应该能够显示...

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字节。好玩好玩。


4
如果你有结构体 Foo { byte a; int b; },情况就会有所不同。由于 b 是 int 类型,它需要对齐,因此会插入额外的填充字节。 - codymanix

2

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


2

我认为C#甚至.NET规范中都没有明确定义这一点。您应该使用StructLayoutFieldOffset属性来指定精确的内存布局。

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

1

在x86 CPU上,字节不需要对齐即可高效工作(但较大的单元需要对齐)。对于其他CPU架构,情况可能有所不同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接