C 能否獲取乙個物件所佔記憶體的大小

2021-06-17 14:24:21 字數 1656 閱讀 1176

今日,在專案重構的時候忽然想到乙個問題,乙個類哪些成員的增加,會影響乙個類所佔記憶體的大小?c#有沒有辦法知道乙個物件佔多少記憶體呢?

第乙個問題:很快想到是類的非靜態的字段、屬性。

第二個問題:首先想到的是sizeof()。

下面開始驗證,首先來驗證值型別,驗證**如下:

int size = sizeof (int); //

4個位元組

注意點:sizeof

運算子僅適用於值型別,而不適用於引用型別。

sizeof

運算子只能在不安全**塊中使用。如下面的**將無法編譯通過:

public

struct

teststuct

int size = sizeof(new teststuct());

修改為marshal.sizeof方法,改方法返回物件的非託管大小(以位元組為單位)。引數可以是引用型別或裝箱的值型別。布局必須是連續的或顯式的。

int size = marshal.sizeof(new teststuct()); //

1個位元組

接下來來驗證引用型別:

由於不能作為非託管結構進行封送處理;無法計算有意義的大小或偏移量。所有下面的**在執行的時候,會丟擲異常。

public

class

student

int size = marshal.sizeof(new student());

需要給student類,加上乙個structlayoutattribute,來控制student類的資料字段的物理布局。修改**為:

[structlayout(layoutkind.sequential)]

public

class

student

int size = marshal.sizeof(new student()); //

1個位元組

layoutkind 預設值為auto.

結論:1:對於託管物件是沒有辦法直接獲取到乙個物件所佔的記憶體大小。

2:非託管物件,可以使用marshal.sizeof

3:對內建型別,如int,long,byte等使用sizeof

擴充套件:有人提出使用二進位制序列化,將乙個物件序列化成乙個memorystream,然後返回memorystream.length,經過驗證是不可以的。

驗證**如下:

[serializable]

public

class

student

private

static

long getobjectsize(object

o)

return

stream.length;}}

var student = new

student();

long size = getobjectsize(student); //

139個位元組

student.txt儲存的文字資訊如下所示,通過文字資訊,可以得知多出來的100多個位元組,估計是就是這一串字串吧。

延伸閱讀:

文章**:

iOS中使用c函式快速獲取乙個目錄所佔的空間大小

轉至 在編寫ios應用時,我們都會大量把伺服器的介面呼叫資料或者資料進行快取,為了更好的使用體驗,有時候我們也會把各種快取的資料所佔的空間大小告訴使用者,提供給使用者參考,並讓使用者可以手動清除快取資料,就像我們在千尋影視中也就提供了這樣乙個設定項。但是當資料多了之後,就會發現所佔空間的大小計算非常...

iOS中使用c函式快速獲取乙個目錄所佔的空間大小

在編寫ios應用時,我們都會大量把伺服器的介面呼叫資料或者資料進行快取,為了更好的使用體驗,有時候我們也會把各種快取的資料所佔的空間大小告訴使用者,提供給使用者參考,並讓使用者可以手動清除快取資料,就像我們在千尋影視中也就提供了這樣乙個設定項。但是當資料多了之後,就會發現所佔空間的大小計算非常耗時,...

獲取乙個物件的屬性

1.object.keys 方法返回乙個陣列,陣列內均為物件自有的可列舉屬性。var keys object.keys testobj console.log keys 輸出 keys name age action 2.object.getownpropertynames 方法返回乙個陣列,陣列內...