2010-12-05 63 views
6

我讀了一本關於C#(Pro C# and the .NET 4 Platform by Andrew Troelsen)和我剛讀這一段:字節變量如何存儲在內存中?

更改基礎類型的 列舉的可以是有益的,如果你是 構建.NET應用程序,將 被部署到低內存設備 (例如啓用.NET的手機或PDA),並且需要儘可能節省內存 。

確實字節使用較少的內存?性能方面的原因,它們不存儲在4字節?我記得在某處讀了後者,但我找不到任何有關它的信息,即使在C#規範中也沒有。

回答

7

這並不簡單。由於變量在一個方法中,它們幾乎與int相同,所以4字節;在一個數組內,它們是單字節的。作爲一個領域...我需要檢查; I 猜測填充意味着它們可能被視爲4字節。一個structsizeof應揭露...

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對齊。趣味有趣的樂趣。

+0

謝謝!這很有趣。 – neo2862 2010-12-05 11:13:06

1

字節不需要對齊即可在x86 CPU上高效工作(儘管如此,大型設備也可以)。對於其他CPU架構,情況可能會有所不同。

2

我認爲這取決於目標平臺。在「低內存」設備上,CLR可能選擇將它們打包緊密,所以如果更改枚舉類型,它將節省內存。

2

我不認爲這是由C#甚至.NET規範明確定義的。您應該使用StructLayout and FieldOffset attributes來指定確切的內存佈局。

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