程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C#類在什麼時候分配內存

C#類在什麼時候分配內存

編輯:C#入門知識

 

一直以為內存分配是在調用構造函數的時候。現在發現我錯了。

 

昨天在看C++的賦值運算時,想做一下筆記。一個類賦值給另一個類時,先調用構造函數,在給成員變量一個個賦值,靜態成員變量不用賦值,因為靜態成員變量屬於類,被類的所有實例共享,所以不用被賦值,方法屬於類,不用被賦值,也賦不了值。

 

突然想到調用靜態的屬性或方法時不需要調用構造函數,因為調用構造函數只是產生一個新的實例,靜態的屬性或方法屬於類嗎,調用它們根本不用產生實例,我突然想尖叫,不調用構造函數,怎麼分配內存,不分配內存類的屬性存哪裡,連內存都沒有怎麼訪問它。

 

所以我猜測內存在調用構造函數之前就分配好了,構造函數只是做一些初始化工作。

 

下面是我的測試:

\

\

 

從圖中我們可以看出,在調用構造函數之前,成員變量已經初始化了,a=1,說明他們已經有屬於他們的內存了,不然a=1,s=1中的1往哪存,你不要告訴我說不需要內存。調用構造函數再對非靜態成員變量進行初始化。在調用靜態方法PrintStatic的過程中的確沒有調用構造函數,大家都知道不需要調用構造函數。靜態方法中只能調用靜態的方法和屬性,而屬性的定義,以及在定義的時候給一個初值,都是在調用構造函數之前,一切都說明屬性在調用構造函數之前已經分配內存了,所以請不要說:內存在調用構造函數的時候分配。

 

一個類占用的內存是多少?我是這樣認為的:

 

一個類所占的內存等於=屬性總內存+方法總內存+應用該類的指針所占的內存+同步索引塊的大小。

 

屬性肯定是占內存的,至於方法,應該也占吧,不知道方法的內存首地址,怎麼訪問它。除了方法所在的內存,其他三個都是必須占內存的,類中可以沒有方法嗎,所以將基本類型賦給object類型(裝箱),會多分配很多內存。

 

而這些所需的內存編譯器是非常清楚的,所以在調用構造函數之前調用完全可以分配內存。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved