![](/img/trans.png)
[英]How to copy Memory<byte> to a specific offset in byte[]
[英]How are byte variables stored in memory?
我正在读一本关于C#( Pro C#和Andrew Troelsen的.NET 4平台 )的书,我刚读过这段话:
如果要构建将部署到低内存设备(例如支持.NET的手机或PDA)的.NET应用程序并且需要尽可能节省内存,则更改枚举的基础类型会很有帮助。
字节使用更少的内存是真的吗? 出于性能原因,它们不是存储在4个字节上吗? 我记得在某个地方读过后者,但我找不到任何关于它的信息,甚至在C#规范中都没有。
这并不简单。 作为方法中的变量 ,它们几乎与int
相同,所以4字节; 在数组内部,它们是单字节的。 作为一个领域...我需要检查; 我猜填充意味着它们可以被视为4字节。 具有sizeof
的struct
应该显示......
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规范明确定义的。 您应该使用StructLayout
和FieldOffset
属性来指定确切的内存布局。
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct TestDByte
{
public double a;
public byte b;
}
不需要对齐字节就可以在x86 CPU上有效工作(不过更大的单位)。 对于其他CPU架构,事情可能会有所不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.