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

我正在读一本关于C#( Pro C#和Andrew Troelsen的.NET 4平台 )的书,我刚读过这段话:

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

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

这并不简单。 作为方法中的变量 ,它们几乎与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; } 

由于需要对齐,因此是8个字节。 有趣的乐趣。

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

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

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

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