sizeof,顧名思義,是描述一個數據類型的size的,也就是大小
簡單地說,其作用就是返回一個對象或者類型所佔的內存字節數。開始我還以爲它是簡簡單單的一個函數而已,在瞭解後才發現,它的學問多着呢!
首先,sizeof有三種語法形式,分別如下:
-
sizeof( object ); // sizeof( 對象 );
-
sizeof( type_name ); // sizeof( 類型 );
-
sizeof object; // sizeof 對象;
也就是說,不能寫成sizeof int;形式
實際上,sizeof計算對象的大小也是轉換成對對象類型的計算,也就是說,同種類型的不同對象其sizeof值都是一致的。
這裏,對象可以進一步延伸至表達式,即sizeof可以對一個表達式求值,編譯器根據表達式的最終結果類型來確定大小,一般不會對錶達式進行計算。如:
sizeof(2);由於2是int數據類型,所以也相當於sizeof(int);
再比如sizeof(2+2.11);由於2.11是double數據類型,所以也相當sizeof(double);
sizeof也可以對一個函數調用求值,其結果就是函數返回數據類型的大小,這裏就不做例子了。
下面我們再來看一下基本數據類型的sizeof:
32位操作系統裏
char:1個字節 short int:2個字節
int:4個字節 unsigned int:4個字節
float:4個字節 double:8個字節
long:4個字節 unsigned long:4個字節
long long:8個字節 *:4個字節
64位操作系統裏
char:1個字節 short int:2個字節
int:4個字節 unsigned int:4個字節
float:4個字節 double:8個字節
long:8個字節 unsigned long:8個字節
long long:8個字節 *:8個字節
數組的sizeof
數組的sizeof等於數組所佔用的內存字節數,如:
char a1[]=“abc”; 那麼sizeof(a1)爲4。因爲
字符串結尾還有一個NULL終止符
int a2[3];那麼結果sizeof(a2)爲3*4爲12,因爲
一個int的sizeof是4
結構體的sizeof
終於到了重頭戲啦!雖然惡補兩天還是沒看懂,但是還是得貼出來呀!太重要太難了!
那麼,sizeof(S1)等於多少呢?
char佔1個字節,int佔4個字節,那麼加起來就應該是5,對嗎?
emmmm不對!不要灰心,我們好好琢磨下sizeof定義:對象或者數據類型佔的內存字節數。
觀察S1的內存,S1的地址爲0x0012FF78,其數據內容如下:
0012FF78:61 CC CC CC FF FF FF FF
爲什麼中間會插入3個CC呢?
這就是傳說中的字節對齊!
計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。爲此,編譯器默認會對結構體進行處理(實際上其它地方的數據變量也是如此),讓寬度爲2的基本數據類型(short等)都位於能被2整除的地址上,讓寬度爲4的基本數據類型(int等)都位於能被4整除的地址上,以此類推。這樣,兩個數中間就可能需要加入填充字節,所以整個結構體的sizeof值就增長了。
在上面的例子中,char佔1位字節,但是該結構體最寬的字節數是int,佔四個字節,所以寬度爲1的char需自動補全到4的倍數上,所以最後sizeof(S1)就爲8。
怎麼樣,這還是最基礎的結構體的sizeof呢!還有更復雜的結構體的sizeof需要我們去討論和研究,但是基於我還沒弄明白!所以接下來的學習任務就要我們一起去學習探討哦!