最近,我讀了Jon Skeet's Blog談論C#對象的佔用空間和開銷。我寫了下面的代碼來複制他的實驗。結構/值類型內存分配和解除位置
class Pixel
{
private byte _r;
private byte _g;
private byte _b;
public int x { get; set; }
public int y { get; set; }
public System.Windows.Media.Color Color
{
get { return System.Windows.Media.Color.FromRgb(_r, _g, _b); }
}
}
static void Main(string[] args)
{
size = 1000;
var array3 = new Pixelsize];
before = GC.GetTotalMemory(true);
for (int i = 0; i < size; i++)
{
array3[i] = new Pixel();
}
after = GC.GetTotalMemory(true);
Console.WriteLine("Pixel is {0} bytes", (after - before)/size);
}
到目前爲止好,該程序報告"Pixel is 15 bytes"
,這是8個字節基地+ 4個字節+ 1 + 1 + 1 = 15個字節。
然後我想知道:struct
實例是否具有與class
實例相同的開銷。所以我將Pixel
更改爲struct
。
struct Pixel
{
private byte _r;
private byte _g;
private byte _b;
public int x { get; set; }
public int y { get; set; }
public System.Windows.Media.Color Color
{
get { return System.Windows.Media.Color.FromRgb(_r, _g, _b); }
}
}
現在,程序報告"Pixel is 0 bytes"
。進入代碼,我發現after
與before
相同。所以struct是一個值類型,它是從堆棧中分配的。對?除此之外,當我檢查寄存器「ESP
」根本沒有改變。所以它不是從堆棧中分配的?
查看TaskManager,演示程序的內存使用量在分配後增加了8000個字節。這8000字節來自哪裏?
最後,由於GC未取消內存分配,我該如何取消分配此內存?我試圖將分配代碼放在一個塊內,並希望array3超出範圍時,這些內存將被釋放。但是,內存使用情況沒有改變。我在這裏得到內存泄漏嗎?
static void Main(string[] args)
{
{
size = 1000;
var array3 = new Pixelsize];
before = GC.GetTotalMemory(true);
for (int i = 0; i < size; i++)
{
array3[i] = new Pixel();
}
after = GC.GetTotalMemory(true);
Console.WriteLine("Pixel is {0} bytes", (after - before)/size);
}
//Expect the memory to be released here, but nothing happened.
}
這意味着什麼? – 2014-10-07 03:40:19