繁体   English   中英

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

[英]How are byte variables stored in memory?

我正在读一本关于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个字节,由于需要的d对准。 有趣的乐趣。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM