我正在读一本关于C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)的书,我刚读过这一段:
更改基础类型 如果你是枚举可能会有所帮助 构建一个.NET应用程序 被部署到低内存设备 (例如支持.NET的手机或 PDA)并需要节省内存 尽可能。
字节使用更少的内存是真的吗?出于性能原因,它们不是存储在4个字节上吗?我记得在某个地方读过后者,但我找不到任何关于它的信息,甚至在C#规范中都没有。
答案 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架构,事情可能会有所不同。