cobject佔多少位元組,c object佔多少位元組

時間 2021-09-01 21:17:18

1樓:匿名使用者

object佔多少記憶體,誰也不知道,按照非託管的想法是,如果你只定義一個類,而它沒有任何資料成員,我在vs2008下,使用預設位元組對齊,

class object

; 這樣得出來 sizeof( object ) 為 1。

在c#裡,是不能直接獲取object佔用記憶體大小的,因為它根本不是一個標準的佈局。

而樓上的binaryformatter的方法,只是以二進位制格式將物件或整個連線物件圖形序列化和反序列化。它甚至還有可能包含版本資訊,所以它的結果並不能代表一個物件所佔用記憶體的大小。

c#提供了一種可以獲取一個物件的非託管記憶體的大小的方法。但是必須在顯式指定了記憶體佈局以及位元組對齊等資訊的物件上才可以使用。

現在我們定義如下物件:

[structlayout( layoutkind.sequential )]

public class myobject

,大家都知道,所有的物件都是從myobject繼承而來的,也就是說,我們上面這個myobject類,也隱含的繼承了object。

那麼,現在我們看看這段**:

int size = marshal.sizeof( typeof( myobject ) );

執行結果是1。

看來跟c++是一樣的。也就是說,一個未定義任何資料成員的空物件,其佔用1位元組的記憶體。

那麼我們再來看看一些標準成員的大小,比如int,long,double等。

int size = marshal.sizeof( typeof( int ) ); //結果為4

int size = marshal.sizeof( typeof( long ) ); //結果為8

int size = marshal.sizeof( typeof( float ) ); //結果為4

int size = marshal.sizeof( typeof( double ) ); //結果為8

可見,這些基本資料型別,與非託管下的大小是沒有區別的。

那麼現在我們來看看混合在一起的情況。

[structlayout( layoutkind.sequential )]

public class mydataobject

然後我們執行 int size = marshal.sizeof( typeof( mydataobject ) );

會發現結果是24。

為什麼是24呢,是因為我們指定了layoutkind.sequential,它的msdn的說明如下:

物件的成員按照它們在被匯出到非託管記憶體時出現的順序依次佈局。這些成員根據在 system.runtime.

interopservices.structlayoutattribute.pack中指定的封裝進行佈局,並且可以是不連續的。

那麼,myojbect 的大小實際上就是所有資料成員記憶體位元組對齊後然後結構體的大小。

則vs2008上,位元組對齊(即structlayoutattribute.pack)預設設定好像是8。

下面是mydataobject物件在預設設定下的對齊情況:

成員 偏移位置(位元組) 記憶體分佈(位元組)

a 0 0

x 4 4-7

b 8 8

c 16 16-23

總長度為24

現在我們來看位元組對齊為4的情況:

成員 偏移位置(位元組) 記憶體分佈(位元組)

a 0 0

x 4 4-7

b 8 8

c 16 12-19

總長度為20。

位元組對齊為2的情況:

成員 偏移位置(位元組) 記憶體分佈(位元組)

a 0 0

x 4 2-5

b 8 6

c 16 8-16

總長度為16。

位元組對齊為1的情況:這就是最緊湊的情況了。

成員 偏移位置(位元組) 記憶體分佈(位元組)

a 0 0

x 4 1-4

b 8 5

c 16 6-13

總長度為14。

總體上來說,.net的物件佔用的空間,跟其它非託管程式是一樣的,只是大部分的物件,由於是託管的,而且沒有規定記憶體佈局,所以我們無法獲得其真正佔用記憶體的大小。

ps:structlayoutattribute類和marshal類位於名稱空間「system.runtime.interopservices」下。

本來上面的對齊的排列順序,我寫的的時候中間有好幾個空格的,不知道為什麼發上來就成一個空格了,排版不好看了,效應著看吧,呵呵

//------------我也來更新一下,不知道你們兩個人在爭什麼?

.net是中間語言,什麼叫做託管?託管的主要意思就是它把記憶體控制權接管了,簡之,你所寫的**並不是像c/c++那樣對記憶體的精確控制。

就拿c#來說,它是號稱沒有指標,但是,實際上大家都看得出來,它的所謂引用型引數,就是指標。為什麼這麼說?你試試呼叫一個非託管的api,如果那個引數是指標型別的話,那你就得用ref了。

就拿你的問題classa a來說,現在我們就假定.net內部是指標,那麼

classa a,就相當於是定義了一個指標,我們知道,指標在32位系統下,佔4位元組。當然,這裡還有一個前提,就是classa是一個class,不是struct或者其它值型別。

至於string型別的成員的佔用記憶體的大小,不知道樓主你會不會c++,有沒有見過std的string是怎麼實現的?為了提交效率,降低記憶體分配頻率,string物件在建立時,就會預設了一個容量長度,這個跟它儲存的字串長度是不一樣的,如果儲存的字串長度超過了容量,那麼它會再重新分配一塊更大的記憶體來儲存。但目前我還沒看到.

net的string物件的源**,所以不知道它的預設容量是多大,那個就應該是它預設佔的記憶體大小。我只知道stringbuilder的預設容量是16,我想string的也許更大些吧。

末了,不知道你們討論一個託管物件的佔用記憶體大小還有什麼意義。

我想你以為我這麼在一段,是**copy來吧,不好意思,我沒有copy別人答案的習慣,全是手敲的,有空的就把我的話,當廢話看吧,我也沒什麼成見,就發表個人觀點而已。

該回家吃飯了,各位,再會,

2樓:匿名使用者

我問的是沒有new佔多大空間

你覺得測試沒有new的物件有意義嗎?其結果我想你也知道,不分配任何空間,不佔用位元組

沒有new的物件,記憶體中根本就不存在

/////////////////////////////最後更新

只能得出賦了初值的物件佔的空間大小?

我不知道你怎麼測試的

object obj = new object();

long longtest = getspaceforobject(obj);

obj = "dsgjskdghsdkghsjkdghkdjkhgk43kjkfdkhjdkfjh";

longtest = getspaceforobject(obj);

obj += "aaafgfhdfhdfh"; ;

longtest = getspaceforobject(obj);

網路上好像獲取物件記憶體佔用空間方法不錯,何況是.net的c#版本

不過書中好像有介紹:例如int佔用4位元組,long暫用8位元組

char佔用1位元組,string根據實際情況來

你搜尋下sizeof關鍵字

我不願意對我目前沒有需求而不瞭解的東西進行**!

////////////////////最新更新

覺得你這問題有點意思,剛才google下,所以我將方法打包送給你

using system;

using system.xml;

using system.io;

using system.threading;

using system.runtime.serialization.formatters.binary;

class test

static long getspaceforobject(object obj)}

3樓:匿名使用者

預設分配最大存貯空間

int佔多少位元組,c語言int佔幾個位元組?

int佔4個位元組。常用微控制器,short和int型至少為16位,long型至少為32位,並且short型長度不能超過int型,而int型不能超過long型。這即是說各個型別的變數長度是由編譯器來決定的,而當前主流的編譯器中一般是32位機器和64位機器中int型都是4個位元組。 在c c 語言中,...

c語言字元數佔幾個位元組又是多少位

這個要看字元數是什麼資料型別,可以用sizeof 型別 操作符來測試位元組數。1 英文字母 如果是char 型,那麼是佔用1個位元組,8位。如果是string型,應該是兩個位元組,16位,因為末尾還有個 0字元。比如 char c a 它佔用一個字元 char c a 佔用兩個。char c abc...

c語言 char佔幾個位元組,C語言的int佔幾個位元組,char佔幾個位元組?

浩笑工坊 只佔一個位元組。char用於c或c 中定義字元型變數,只佔一個位元組,取值範圍為 128 127 2 7 2 7 1 c語言中如int long short等不指定signed或unsigned時都預設為signed,但char在標準中不指定為signed或unsigned,編譯器可以編譯...