sizeof函式總結

2021-07-08 12:34:10 字數 2117 閱讀 1350

本文**:

sizeof函式功能:計算資料空間的位元組數

1.與strlen()比較

strlen計算字元陣列的字元數,以"\0"為結束判斷,不計算為'\0'的陣列元素。

sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示(當然用在字元陣列計算"\0"的大小)。

2.指標與靜態陣列的sizeof操作

指標均可看為變數型別的一種。所有指標變數的sizeof 操作結果均為4。

例項1::char *p;

sizeof(p)=4;

sizeof(*p) = 1; 

//相當於sizeof(char); 

例項2: 

對於靜態陣列,sizeof可直接計算陣列大小;

例:int a[10];

char b="hello";

sizeof(a)等於4*10=40;

sizeof(b)等於6;

void  fun(char p)

例項3(經典考題):

double* (*a)[3][6];

cout< (double*)=24。

***a就表示其中的乙個元素,也就是double*了,所以sizeof(***a)=4。

****a,就是乙個double了,所以sizeof(****a)=sizeof(double)=8。

3.格式的寫法

sizeof操作符,對變數或物件可以不加括號,但若是型別,須加括號。

4.使用sizeof時string的注意事項

string s="hello";

sizeof(s)等於string類的大小(32),sizeof(s.c_str())得到的是與字串長度(4)。

5.union 與struct的空間計算

總體上遵循兩個原則:

(1)整體空間是占用空間最大的成員(型別)所佔位元組的整數倍

(2)資料對齊原則----資料在記憶體中按照結構成員先後順序進行排序,當排到該成員變數時,其前面已擺放的空間大小必須是該成員型別大小的整倍數,如果不夠則補齊,以此向後類推。。。。。

注意:陣列按照單個變數乙個乙個的擺放,而不是看成整體。如果成員中有自定義的類、結構體,也要注意陣列問題。

例項4:[引用其他帖子的內容]

因為對齊問題使結構體的sizeof變得比較複雜,看下面的例子:(預設對齊方式下)

struct s1;

struct s2;

cout<

同樣是兩個char型別,乙個int型別,乙個double型別,但是因為對齊問題,導致他們的大小不同。計算結構體大小可以採用元素擺放法,我舉例子說明一下:首先,cpu判斷結構體的對界,根據上一節的結論,s1和s2的對界都取最大的元素型別,也就是double型別的對界8。然後開始擺放每個元素。

對於s1,首先把a放到8的對界,假定是0,此時下乙個空閒的位址是1,但是下乙個元素b是double型別,要放到8的對界上,離1最接近的位址是8了,所以b被放在了8,此時下乙個空閒位址變成了16,下乙個元素c的對界是4,16可以滿足,所以c放在了16,此時下乙個空閒位址變成了20,下乙個元素d需要對界1,也正好落在對界上,所以d放在了20,結構體在位址21處結束。由於s1的大小需要是8的倍數,所以21-23的空間被保留,s1的大小變成了24。

對於s2,首先把a放到8的對界,假定是0,此時下乙個空閒位址是1,下乙個元素的對界也是1,所以b擺放在1,下乙個空閒位址變成了2;下乙個元素c的對界是4,所以取離2最近的位址4擺放c,下乙個空閒位址變成了8,下乙個元素d的對界是8,所以d擺放在8,所有元素擺放完畢,結構體在15處結束,占用總空間為16,正好是8的倍數。

這裡有個陷阱,對於結構體中的結構體成員,不要認為它的對齊方式就是他的大小,看下面的例子:

例項5:

struct s1;

struct s2;

struct s3;

struct s4

;cout<

sizeof int:4

sizeof short:2

sizeof long:4

sizeof float:4

sizeof double:8

sizeof char:1

sizeof p:4

sizeof word:2

sizeof dword:4

sizeof函式總結

sizeof函式功能 計算資料空間的位元組數 1.與strlen 比較 strlen計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 當然用在字元陣列計算 0 的大小 2.指標與靜態陣列的size...

sizeof函式總結

sizeof函式功能 計算資料空間的位元組數 1.與strlen 比較 strlen計算字元陣列的字元數,以 0 為結束判斷,不計算為 0 的陣列元素。sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示 當然用在字元陣列計算 0 的大小 2.指標與靜態陣列的size...

sizeof用法總結

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