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 的對界,假定是
0 ,此時下乙個空閒的位址是
1 ,但是下乙個元素
d 是double
型別,要放到
8 的對界上,離
1 最接近的位址是
8 了,所以
d 被放在了
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 的倍數。
這裡有個陷阱,對於結構體中的結構體成員,不要認為它的對齊方式就是他的大小,看下面的例子:
struct s1
;struct s2
;struct s3
;struct s4
;cout<
cout<
cout<
cout<
s1 和
s2 大小雖然都是
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用法總結
在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...