我讀了一本關於C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)和我剛讀這一段:字節變量如何存儲在內存中?
更改基礎類型的 列舉的可以是有益的,如果你是 構建.NET應用程序,將 被部署到低內存設備 (例如啓用.NET的手機或PDA),並且需要儘可能節省內存 。
確實字節使用較少的內存?性能方面的原因,它們不存儲在4字節?我記得在某處讀了後者,但我找不到任何有關它的信息,即使在C#規範中也沒有。
我讀了一本關於C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)和我剛讀這一段:字節變量如何存儲在內存中?
更改基礎類型的 列舉的可以是有益的,如果你是 構建.NET應用程序,將 被部署到低內存設備 (例如啓用.NET的手機或PDA),並且需要儘可能節省內存 。
確實字節使用較少的內存?性能方面的原因,它們不存儲在4字節?我記得在某處讀了後者,但我找不到任何有關它的信息,即使在C#規範中也沒有。
這並不簡單。由於變量在一個方法中,它們幾乎與int
相同,所以4字節;在一個數組內,它們是單字節的。作爲一個領域...我需要檢查; I 猜測填充意味着它們可能被視爲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
對齊。趣味有趣的樂趣。
字節不需要對齊即可在x86 CPU上高效工作(儘管如此,大型設備也可以)。對於其他CPU架構,情況可能會有所不同。
我認爲這取決於目標平臺。在「低內存」設備上,CLR可能選擇將它們打包緊密,所以如果更改枚舉類型,它將節省內存。
我不認爲這是由C#甚至.NET規範明確定義的。您應該使用StructLayout
and FieldOffset
attributes來指定確切的內存佈局。
[StructLayout(LayoutKind.Sequential, Pack=1)]
struct TestDByte
{
public double a;
public byte b;
}
謝謝!這很有趣。 – neo2862 2010-12-05 11:13:06