1. 常量:視爲靜態成員,因爲一開始就出初始化好的。在編譯時候確定,存儲在元數據中。下編譯過程,從元數據中查找定義常量的符號,然後提取常量的值內嵌到IL代碼,直接內嵌意味着不需要分配內存
2.字段:初始化方式a.內聯初始化(實際上也是通過過構造器初始化的這個僅僅是一個語法的簡化) b.構造器初始化
只讀字段:通過構造器和內聯初始化
靜態字段:是在首次引用了該類型時候初始化,內存分配在默認域即:三大域一個堆中的 Appdomain 域中。
實例字段的初始化上幾篇提到是在該類型首次實例化時候分配的內存。
關鍵字 Volatile :禁止編譯器對該行代碼做優化。很抽象是吧,順便科普一個知識點。
類中的字段有自己的默認內存排序方式通過一個屬性控制。如下幾個方式控制:
(StructLayout、LayoutKind.Explicit、FieldOffset 可以自己百度下不做重點涉及,一般採用默認)
JIT會在編譯時候優化字段順序時候儘可能使內存緊湊,這樣減少GC觸發次數。
字段用volatile修飾後,編譯器、CLR和硬件不會對訪問這種字段的代碼執行“線程不安全”的優化。後面的基元線程同步構造中會涉及到該關鍵字的作用,後續再給大家分解。
這個系列進度緩慢,是不我待接下來還要分析一波Java, Go,時間上比較緊張因此後續系列需要加快了,儘量做到一日一章。