sizeof用法總結

2021-07-15 10:33:25 字數 2835 閱讀 2821

sizeof用法總結:

例子1:

int main(int argc, char *argv)

; cout<

例子5:

class x

;int main(int argc, char *argv)

//例題:

char var[10];

int test(char var)

5. 大部分編譯器在編譯的時候就把sizeof計算出來了,所以sizeof(x)可以直接用來定義陣列的維數。而strlen的結果要在執行的時候才能計算出來,用來計算字串的長度,而不是計算型別或變數佔記憶體的大小。

char str[20] = "0123456789";

int a = strlen(str); //a=10

int b[sizeof(str)] ; //b是維度為20的int型陣列

6

.sizeof後如果是型別必須加括號,如果是變數可不用加括號,這是因為sizeof是操作符,而不是函式。

7.sizeof()不是括號裡的內容是不被編譯的,而是被型別替代,如int a = 8;sizeof(a)在編譯過程中,只是被替換成sizeof(int),結果為4,同樣,sizeof(a=6)執行後,a的值還是為8不變。

8.unisgned 影響的只是最高位bit的意義,資料長度是不會改變的,所以sizeof(unsigned int) = sizeof(int).

9.自定義的型別sizeof取值等於它的型別原形:typedef short word,sizeof(word)== sizeof(short)

10.對函式使用sizeof,在編譯期間會被函式的返回值型別替代。

11.只要是指標,sizeof計算的大小就是4。

12.陣列的大小是各維數的乘積*陣列元素的大小。

sizeof計算類的大小:

類的sizeof大小一般是類中的所有成員的sizeof大小之和,這個就不用多說。

不過有幾點需要注意:

1)當類中含有虛成員函式的時候,例如:

class b

此時sizeof(b)的大小為8,而不是4。因為在類中隱藏了乙個指標,該指標指向虛函式表,正因為如此,

使得c++能夠支援多型,即在執行時繫結函式的位址。 2)

另乙個要注意的是,當類中沒有任何成員變數,也沒有虛函式的時候,該類的大小是多少呢?

例如:

class b2

此時sizeof(b2)的值是多少呢?在c++早期的編譯器中,這個值為0;然而當建立這樣的物件時,

它們與緊接著它們後面的物件有相同的位址。比如:

b2 b2;

int a;

那麼物件b2與變數a有相同的位址,這樣的話對物件b2位址的操作就會影響變數a。所以在現在大多數編譯器中,該值的大小為1。

3)類中的靜態成員、及普通成員函式是不算入類的記憶體大小的

class a

;

此時sizeof(a)的大小為8,分別為b和c的變數之和

4)在類的繼承中,如果是普通繼承,子類的大小是子類的大小加上其所父類的大小之和,如果是虛繼承,除了加上父類的大小,還需要計算指向父類的虛指標大小。

例項如下:

class a

; char a;

const int c;

static int d;

};class b : public a;};

class c : public virtual b;};

int main()

{ cout<

sizeof(a):虛函式指標(4)+ char型成員(原為1,位數補齊為4) + const int 型成員(4)  合計12

sizeof(b):char型陣列(原為3,位數補齊為4) + 父類a的大小 (12) 合計16,需要注意的是,這裡面b類中的虛函式和其父類的虛函式共用乙個虛表,因此只用計算父類指向虛函式的指標,子類中忽略這一項。

sizeof(c):這裡是虛擬繼承,子類不與父類公用虛函式表,因此子類的指標需要單獨計算,char型陣列(4)+ 虛函式指標(4)+ 虛基類偏移量表指標(4)+ 父類的大小(16) 合計28

以下部分引用自:

類中各種情況下記憶體大小計算總結:

1.普通單繼承,只需將自身成員變數的大小加上父類大小(父類中 有虛函式,子類中不管有沒有)若父類沒有虛函式,則子類大小需要加上指向虛表的指標大小。

2.普通多繼承,若幾個父類都有虛表,則子類與第乙個父類公用乙個虛表指標,其他有幾個有虛函式的父類則就有幾個虛表指標。

3.虛擬單繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不加)再加上自身的成員變數大小,還要加上乙個虛類指標ptr_sonclass_fatherclass,最後加上父類的大小。

4.多重虛擬繼承,此時若子類有虛函式則加上乙個自身的虛表指標的大小,(若沒有則不叫)再加上自身的成員變數大小,還要加上 乙個公用的虛類指標(不管有幾個虛擬父類,只加乙個),在加上所有父類的大小。

5.普通、虛擬混合多繼承,此時子類的大小為自身大小(若子類或普通父類有虛函式,則為成員變數+虛表指標大小;若都沒虛函式,則就為成員變數大小),加上乙個虛類指標大小,在加上虛擬父類的大小,在加上普通父類的大小(除虛表指標,因為它和子類公用乙個虛表指標)。

sizeof用法總結

在vc中,sizeof有著許多的用法,而且很容易引起一些錯誤。下面根據sizeof後面的 引數對sizeof的用法做個總結。a 引數為資料型別或者為一般變數。例如sizeof int sizeof long 等等。這種情 況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在...

sizeof 用法總結

sizeof 功能 計算資料空間的位元組數 1.與strlen 比較 strlen 計算字元陣列的字元數,以 0 為結束判斷。而sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的一種。所有指標變數的siz...

sizeof用法總結

sizeof用法總結 以下執行環境都是一般的,在32位編譯環境中 1,基本資料型別的sizeof cout 再看示例 pragma pack push 將當前pack設定壓棧儲存 pragma pack 2 必須在結構體定義之前使用 struct s1 struct s3 pragma pack p...