詳解sizeof操作符

2021-06-03 21:46:58 字數 2520 閱讀 9833

一、sizeof是c語言的一種單目操作符,如c語言的其他操作符++、--等。它並不是函式。sizeof操作符以位元組形式給出了其運算元的儲存大小。運算元可以是乙個表示式或括在括號內的型別名。運算元的儲存大小由運算元的型別決定。

二、sizeof的使用方法

1、用於資料型別 

sizeof使用形式:sizeof(type) 

如sizeof(int)。 

2、用於變數 

sizeof使用形式:sizeof(var_name)

三、sizeof的結果

sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。 

1、若運算元具有型別char、unsigned char或signed char,其結果等於1。 

ansi c正式規定字元型別為1位元組。 

2、int、unsigned int 、short int、unsigned short 、long int 、unsigned long 、 float、double、long double型別的sizeof 在ansi c中沒有具體規定,大小依賴於實現,一般可能分別為2、2、2、2、 4、4、4、8、10。 

3、當運算元是指標時,sizeof依賴於編譯器。例如microsoft c/c++7.0中,near類指標位元組數為2,far、huge類指標位元組數為4。一般unix的指標位元組數為4。 

4、當運算元具有陣列型別時,其結果是陣列的總位元組數。 

5、聯合型別運算元的sizeof是其最大位元組成員的位元組數。結構型別運算元的sizeof是這種型別物件的總位元組數,包括任何墊補在內。

四、sizeof後面的引數對sizeof的用法做個總結。

a. 引數為資料型別或者為一般變數。例如sizeof(int),sizeof(long)等等。這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int型別在16位系統中佔2個位元組,在32位系統中佔4個位元組。

b. 引數為陣列或指標。下面舉例說明.

int a[50]; //sizeof(a)=4*50=200; 求陣列所佔的空間大小

int *a=new int[50];// sizeof(a)=4; a為乙個指標,sizeof(a)是求指標

//的大小,在32位系統中,當然是佔4個位元組。

c. 引數為結構或類。sizeof應用在類和結構的處理情況是相同的。但有兩點需要注意,第

一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變數的儲存位置與結構或者類的例項位址無關.

九個注意點:

1.sizeof操作符的結果型別是size_t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。

2.sizeof是運算子

3.sizeof可以用型別做引數,還可以用函式做引數

4.陣列做sizeof的引數不退化

5.sizeof在編譯期已經確定大小,這就是sizeof(x)可以用來定義陣列維數的原因

6.sizeof後如果是型別必須加括弧,如果是變數名可以不加括弧。這是因為sizeof是個操作符不是個函式

7..當適用了於乙個結構型別時或變數, sizeof 返回實際的大小, 當適用一靜態地空間陣列, sizeof 歸還全部陣列的尺 寸。 sizeof 操作符不能返回動態地被分派了的陣列或外部的陣列的尺寸

8..計算結構變數的大小就必須討論資料對齊問題。為了cpu訪問的速度最快(這同cpu取數操作有關,詳細的介紹可以參考一些計算機原理方面的書),c++在處理資料時經常把結構變數中的成員的大小按照4或8的倍數計算,這就叫資料對齊(data alignment)。這樣做可能會浪費一些記憶體,但理論上速度快了。當然這樣的設定會在讀寫一些別的應用程式生成的資料檔案或交換資料時帶來不便。ms vc++中的對齊設定,有時候sizeof得到的與實際不等。一般在vc++中加上#pragma pack(n)的設定即可.或者如果要按位元組儲存,而不進行資料對齊,可以在options對話方塊中修改advanced compiler頁中的data alignment為按位元組對齊。

9..sizeof操作符不能用於函式型別,不完全型別或位字段。不完全型別指具有未知儲存大小的資料型別,如未知儲存大小的陣列型別、未知內容的結構或聯合型別、void型別等。如sizeof(max)若此時變數max定義為int max(),sizeof(char_v) 若此時char_v定義為char char_v [max]且max未知,sizeof(void)都不是正確形式  

【sizeof使用場合】

1.sizeof操作符的乙個主要用途是與儲存分配和i/o系統那樣的例程進行通訊

2.用它可以看看一型別的物件在記憶體中所佔的單元位元組。

3.在動態分配一物件時,可以讓系統知道要分配多少記憶體。  

4.便於一些型別的擴充,在windows中就有很多結構內型就有乙個專用的字段是用來放該型別的位元組大小。  

5.由於運算元的位元組數在實現時可能出現變化,建議在涉及到運算元位元組大小時用sizeof來代替常量計算。  

6.如果運算元是函式中的陣列形參或函式型別的形參,sizeof給出其指標的大小。

資料收集自

sizeof操作符詳解

論及測試基礎是windows 32位平台,vs2008開發工具 測試基本型別 1.基本規則 sizeof 操作符的作用是返回乙個物件或型別名所佔的記憶體位元組數,返回值的型別為size t,長度的單位是位元組,在編譯而不是執行時確定。對引用型別做sizeof操作將返回存放此引用型別物件所需的內在空間...

c c 操作符之sizeof

1 基本資料型別 常見的基本資料型別有void bool char int short int long int float double long long long double等。同型別有符號與無符號所佔位元組數相同,故在此不做區分。型別大小 void 0 byte bool 1 byte c...

操作符詳解

操作符的兩個運算元必須為整數 左移操作符 右移操作符左移操作符規則 右邊補0 右移操作符規則 1 邏輯移位 僅是移位操作符 左邊補0 2 算數移位 要考慮符號位 左邊補符號位 注意 對於一位運算子不要移動負數字,這是為標準定義的 按位與 按位或 按位異或位操作符的運算元必須是整數 賦值復合賦值符 例...