C#的值類型內存分配總是和上下文有關,而不總是在堆棧上
總是很常見到一些說法是值類型總是分配在堆棧上,引用類型總是分配在堆上(google搜索大約10萬條記錄- -)
最近仔細思考了一下發現有點問題....當然我個人水平有限, 有什么差錯還請大家指正
個人總結的c#值類型和應用類型的分配應該是:
應用類型肯定在托管堆上,值類型總是和上下文有關
1.類的實例成員, 類是引用類型,總是分配在堆上,那么a的內存就在ClassA的實例的內存里,也必然在堆上
class ClassA
{
int a;
}
2.類的靜態成員,靜態成員a總是在Typeof(ClassA)的內存里,那么也必然在堆上
PS:每個類必然有一個定義類方法,類靜態成員等的Type對象,一個類可能可能有無數個實例,當永遠只有一個Type定義,這也就是為什么靜態構造函數也叫類型構造函數,并且永遠只執行一次的原因
class ClassA
{
static int a;
}
3.結構體的靜態和實例值類型成員和結構體所在的上下文有關
4.參數 Parameter,參數變量的內存總是位于執行堆棧上
void Test(int i)
{
Console.WriteLine(i);
}
5.本地變量(非閉包),參數變量的內存總是位于執行堆棧上
void Test()
{
int i = 100;
Console.WriteLine(i);
}
6.本地變量(閉包),dotnet會將lambda表達式和匿名委托編譯為一個類,由于這個類中使用到了i1,本地變量i1將被編譯到這個類里面,類的實例成員自然是在堆上啦
static void Main(string[] args)
{
int i1 = 1;
Func<int> f = () => { return i1; };
}
這里的堆棧:指的是執行堆棧
這里的堆:托管堆
浙公網安備 33010602011771號