今日,在專案重構的時候忽然想到乙個問題,乙個類哪些成員的增加,會影響乙個類所佔記憶體的大小?c#有沒有辦法知道乙個物件佔多少記憶體呢?
第乙個問題:很快想到是類的非靜態的字段、屬性。
第二個問題:首先想到的是sizeof()。
下面開始驗證,首先來驗證值型別,驗證**如下:
int size = sizeof (int); //注意點:sizeof4個位元組
運算子僅適用於值型別,而不適用於引用型別。
sizeof
運算子只能在不安全**塊中使用。如下面的**將無法編譯通過:
public修改為marshal.sizeof方法,改方法返回物件的非託管大小(以位元組為單位)。引數可以是引用型別或裝箱的值型別。布局必須是連續的或顯式的。struct
teststuct
int size = sizeof(new teststuct());
int size = marshal.sizeof(new teststuct()); //接下來來驗證引用型別:1個位元組
由於不能作為非託管結構進行封送處理;無法計算有意義的大小或偏移量。所有下面的**在執行的時候,會丟擲異常。
public需要給student類,加上乙個structlayoutattribute,來控制student類的資料字段的物理布局。修改**為:class
student
int size = marshal.sizeof(new student());
[structlayout(layoutkind.sequential)]layoutkind 預設值為auto.public
class
student
int size = marshal.sizeof(new student()); //
1個位元組
結論:1:對於託管物件是沒有辦法直接獲取到乙個物件所佔的記憶體大小。
2:非託管物件,可以使用marshal.sizeof
3:對內建型別,如int,long,byte等使用sizeof
擴充套件:有人提出使用二進位制序列化,將乙個物件序列化成乙個memorystream,然後返回memorystream.length,經過驗證是不可以的。
驗證**如下:
[serializable]student.txt儲存的文字資訊如下所示,通過文字資訊,可以得知多出來的100多個位元組,估計是就是這一串字串吧。public
class
student
private
static
long getobjectsize(object
o)
return
stream.length;}}
var student = new
student();
long size = getobjectsize(student); //
139個位元組
延伸閱讀:
文章**:
iOS中使用c函式快速獲取乙個目錄所佔的空間大小
轉至 在編寫ios應用時,我們都會大量把伺服器的介面呼叫資料或者資料進行快取,為了更好的使用體驗,有時候我們也會把各種快取的資料所佔的空間大小告訴使用者,提供給使用者參考,並讓使用者可以手動清除快取資料,就像我們在千尋影視中也就提供了這樣乙個設定項。但是當資料多了之後,就會發現所佔空間的大小計算非常...
iOS中使用c函式快速獲取乙個目錄所佔的空間大小
在編寫ios應用時,我們都會大量把伺服器的介面呼叫資料或者資料進行快取,為了更好的使用體驗,有時候我們也會把各種快取的資料所佔的空間大小告訴使用者,提供給使用者參考,並讓使用者可以手動清除快取資料,就像我們在千尋影視中也就提供了這樣乙個設定項。但是當資料多了之後,就會發現所佔空間的大小計算非常耗時,...
獲取乙個物件的屬性
1.object.keys 方法返回乙個陣列,陣列內均為物件自有的可列舉屬性。var keys object.keys testobj console.log keys 輸出 keys name age action 2.object.getownpropertynames 方法返回乙個陣列,陣列內...