sizeof 用法彙總 zhuan

2022-04-13 23:50:14 字數 3431 閱讀 8906

sizeof()功能:計算資料空間的位元組數

1.與strlen()比較

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

而sizeof計算資料(包括陣列、變數、型別、結構體等)所佔記憶體空間,用位元組數表示。

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

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

注意:int *p; sizeof(p)=4;

但sizeof(*p)相當於sizeof(int);      

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

例:int a[10];char b="hello";

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

sizeof(b)等於6;

注意:陣列做型參時,陣列名稱當作指標使用!!

void  fun(char p)

經典問題:

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

coutcout<*a為乙個有3*6個指標元素的陣列

cout<**a為陣列一維的6個指標

cout<***a為一維的第乙個指標

cout<****a為乙個double變數

問題解析:a

是乙個很奇怪的定義,他表示乙個指向

double*[3][6]

型別陣列的指標。既然是指標,所以

sizeof(a)就是4

。既然a是執行

double*[3][6]

型別的指標,

*a就表示乙個

double*[3][6]

的多維陣列型別,因此

sizeof(*a)=3*6*sizeof(double*)=72

。同樣的,

**a表示乙個

double*[6]

型別的陣列,所以

sizeof(**a)=6*sizeof  (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類的大小,sizeof(s.c_str())得到的是與字串長度。

5.union 與struct的空間計算

總體上遵循兩個原則:

(1)整體空間是 

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

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

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

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

因為對齊問題使結構體的

sizeof

變得比較複雜,看下面的例子:

(預設對齊方式下

)struct s1

;struct s2

;cout<

cout<

同樣是兩個

char

型別,乙個

int型別,乙個

double

型別,但是因為對齊問題,導致他們的大小不同。計算結構體大小可以採用元素擺放法,我舉例子說明一下:首先,

cpu判斷結構體的對界,根據上一節的結論,s1和

s2的對界都取最大的元素型別,也就是

double

型別的對界

8。然後開始擺放每個元素。

對於s1

,首先把a放到

8的對界,假定是01

,但是下乙個元素d是

double

型別,要放到

8的對界上,離

1最接近的位址是

8了,所以

d被放在了816

,下乙個元素

c的對界是4,

16可以滿足,所以

c放在了

1620

,下乙個元素

d需要對界

1,也正好落在對界上,所以

d放在了

20,結構體在位址

21處結束。由於

s1的大小需要是

8的倍數,所以

21-23

的空間被保留,

s1的大小變成了24。

對於s2

,首先把a放到

8的對界,假定是01

,下乙個元素的對界也是

1,所以

b擺放在12

;下乙個元素

c的對界是

4,所以取離

2最近的位址4擺放

c8,下乙個元素

d的對界是

8,所以

d擺放在

8,所有元素擺放完畢,結構體在

15處結束,占用總空間為

16,正好是

8的倍數。

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

struct s1

;struct s2

;struct s3

;struct s4

;cout<

cout<

cout<

couts2大小雖然都是

8,但是

s1的對齊方式是1,

s2是8(

double

),所以在s3和

s4中才有這樣的差異。

所以,在自己定義結構體的時候,如果空間緊張的話,最好考慮對齊因素來排列結構體裡的元素。

補充:不要讓double干擾你的位域 

在結構體和類中,可以使用位域來規定某個成員所能占用的空間,所以使用位域能在一定程度上節省結構體占用的空間。不過考慮下面的**: 

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計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2.指標與靜態陣列的sizeof操作 指標均可看為變數型別的...

sizeof 用法彙總

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

sizeof 用法彙總

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