sizeof是乙個操作符(operator)。其作用是返回乙個物件或型別所佔的記憶體位元組數。
其返回值型別為size_t。(size_t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigned int size_t;)sizeof有三種語法形式:
1) sizeof (object); //sizeof (物件)
2) sizeof object; //sizeof 物件
3) sizeof (type_name); //sizeof (型別)
物件可以是各種型別的變數,以及表示式(一般sizeof不會對表示式進行計算)。
sizeof對物件求記憶體大小,最終都是轉換為對物件的資料型別進行求值。
sizeof (表示式); //值為表示式的最終結果的資料型別的大小
例子:
int i;
sizeof(int); //值為4
sizeof(i); //值為4,等價於sizeof(int)
sizeof i; //值為4
sizeof(2); //值為4,等價於sizeof(int),因為2的型別為int
sizeof(2 + 3.14); //值為8,等價於sizeof(double),因為此表示式的結果的型別為double
char ary[sizeof(int) * 10]; //ok,編譯無誤
1. 基本資料型別的sizeof這裡的基本資料型別是指short、int、long、float、double這樣的簡單內建資料型別。
由於它們的記憶體大小是和系統相關的,所以在不同的系統下取值可能不同。
2. 結構體的sizeof結構體的sizeof涉及到位元組對齊問題。
為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。
位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則:
1) 結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。
2) 結構體的每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(internal adding)。
3) 結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員後加上填充位元組(trailing padding)。
注意:空結構體(不含資料成員)的sizeof值為1。試想乙個「不佔空間「的變數如何被取位址、兩個不同的「空結構體」變數又如何得以區分呢,於是,「空結構體」變數也得被儲存,這樣編譯器也就只能為其分配乙個位元組的空間用於佔位了。
例子:
struct s1
; sizeof(s1); //值為8,位元組對齊,在char之後會填充3個位元組。
struct s2
; sizeof(s2); //值為8,位元組對齊,在char之後會填充3個位元組。
struct s3
; sizeof(s3); //值為1,空結構體也佔記憶體。
3. 聯合體的sizeof結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共享一段記憶體;所以整個聯合體的sizeof也就是每個成員sizeof的最大值。
例子:
union u
; sizeof(u); //值為8
4. 陣列的sizeof陣列的sizeof值等於陣列所占用的記憶體位元組數。
注意:1)當字元陣列表示字串時,其sizeof值將』/0』計算進去。
2)當陣列為形參時,其sizeof值相當於指標的sizeof值。
例子1:
char a[10];
char n = "abc";
cout<<"char a[10] "<5. 指標的sizeof指標是用來記錄另乙個物件的位址,所以指標的記憶體大小當然就等於計算機內部位址匯流排的寬度。
在32位計算機中,乙個指標變數的返回值必定是4。
指標變數的sizeof值與指標所指的物件沒有任何關係。
例子:char *b = "helloworld";
char *c[10];
double *d;
int **e;
void (*pf)();
cout<<"char *b = /"helloworld/" "<6. 函式的sizeofsizeof也可對乙個函式呼叫求值,其結果是函式返回值型別的大小,函式並不會被呼叫。
對函式求值的形式:sizeof(函式名(實參表))
注意:1)不可以對返回值型別為空的函式求值。
2)不可以對函式名求值。
3)對有引數的函式,在用sizeof時,須寫上實參表。
例子:#include using namespace std;
float funcp(int a, float b)
int funcnp()
void func()
int main()
{ cout<
static關鍵字使用總結
static使用特點如下 1 引用這個方法時,可以使用物件名做字首,也可以使用類名做字首 2 static方法不能被覆蓋,也就是說,這個類的子類,不能有相同名 相同引數的方法 3 static方法只能訪問static方法,不能訪問非static方法,但非static方法可以訪問static方法 4 ...
oracle join關鍵字使用總結
1.內連線 b color red 選出兩個表中所有符合連線條件的row構成的集合。color b 2.外連線 分為left right full三種 如有r與s做連線,那麼left是所有滿足條件的row以及所有在r屬性對應值在s中為null的集合。注意 color red left join 是 ...
關鍵字const的使用總結
1.const是一種型別修飾符,用於說明永不改變的物件,const物件一旦定義就無法再改變,所以const物件必須初始化。2.頂層const與底層const區別 位於 左側為底層const,位於 右側為頂層const 頂層const意味著記憶體本身儲存的資料是常量,如int const a 3 即變...