c 中的sizeof 運算子

2021-09-07 18:43:54 字數 3710 閱讀 7560

sizeof是乙個操作符(operator)。

其作用是返回乙個物件或型別所佔的記憶體位元組數。

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,編譯無誤

這裡的基本資料型別是指short、int、long、float、double這樣的簡單內建資料型別。

由於它們的記憶體大小是和系統相關的,所以在不同的系統下取值可能不同。

結構體的sizeof涉及到位元組對齊問題。

為什麼需要位元組對齊?計算機組成原理教導我們這樣有助於加快計算機的取數速度,否則就得多花指令週期了。為此,編譯器缺省會對結構體進行處理(實際上其它地方的資料變數也是如此),讓寬度為2的基本資料型別(short等)都位於能被2整除的位址上,讓寬度為4的基本資料型別(int等)都位於能被4整除的位址上,依次類推。這樣,兩個數中間就可能需要加入填充位元組,所以整個結構體的sizeof值就增長了。

位元組對齊的細節和編譯器的實現相關,但一般而言,滿足三個準則:

結構體變數的首位址能夠被其最寬基本型別成員的大小所整除。

結構體的每個成員相對於結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要,編譯器會在成員之間加上填充位元組(internal adding)。

結構體的總大小為結構體最寬基本型別成員大小的整數倍,如有需要,編譯器會在最末乙個成員後加上填充位元組(trailing padding)。

注意:空結構體(不含資料成員)的sizeof值為1。試想乙個「不佔空間「的變數如何被取位址、兩個不同的「空結構體」變數又如何得以區分呢,於是,「空結構體」變數也得被儲存,這樣編譯器也就只能為其分配乙個位元組的空間用於佔位了。

例子:

struct s1  

;sizeof

(s1)

;//值為8,位元組對齊,在char之後會填充3個位元組。

struct s2

;sizeof

(s2)

;//值為8,位元組對齊,在char之後會填充3個位元組。

struct s3

;sizeof

(s3)

;//值為1,空結構體也佔記憶體

結構體在記憶體組織上市順序式的,聯合體則是重疊式,各成員共享一段記憶體;所以整個聯合體的sizeof也就是每個成員sizeof的最大值。

union u  

;sizeof

(u);

//值為8

陣列的sizeof值等於陣列所占用的記憶體位元組數。

注意:當字元陣列表示字串時,其sizeof值將』/0』計算進去。

當陣列為形參時,其sizeof值相當於指標的sizeof值。

例子1:

char a[10]

;char n=

"abc"

;

cout<<

"char a[10] "

<<

sizeof

(a)

cout<<

"char n = /"abc/

" "

<<

sizeof

(n)

例子2:

void

func

(char a[3]

)void

funcn

(char b)

指標是用來記錄另乙個物件的位址,所以指標的記憶體大小當然就等於計算機內部位址匯流排的寬度。

在32位計算機中,乙個指標變數的返回值必定是4。

指標變數的sizeof值與指標所指的物件沒有任何關係。

例子:

char

*b =

"helloworld"

;char

*c[10];

double

*d;int

**e;

void

(*pf)()

;

cout<<

"char *b = /"helloworld/

" "

<<

sizeof

(b)

cout<<

"char *b "

<<

sizeof

(*b)

cout<<

"double *d "

<<

sizeof

(d)

cout<<

"double *d "

<<

sizeof

(*d)

cout<<

"int **e "

<<

sizeof

(e)

cout<<

"char *c[10] "

<<

sizeof

(c)

cout<<

"void (*pf)(); "

<<

sizeof

(pf)

sizeof也可對乙個函式呼叫求值,其結果是函式返回值型別的大小,函式並不會被呼叫。

對函式求值的形式:sizeof(函式名(實參表))

注意:不可以對返回值型別為空的函式求值。

不可以對函式名求值。

對有引數的函式,在用sizeof時,須寫上實參表。

例子:

#include

using namespace std;

float

funcp

(int a,

float b)

intfuncnp()

void

func()

intmain()

C語言 sizeof 運算子

今天看了一篇文章叫 c c 刁鑽問題各個擊破之細說sizeof 然後自己想寫一寫。sizeof的作用 1.求基本型別和復合型別所佔的記憶體位元組數 如 sizeof int sizeof int 2.求某個變數或者常量所佔的記憶體位元組數 如 int i sizeof i sizeof 5 size...

(24)位運算子 sizeof運算子

位運算子作用於整數型別,並把運算物件看成是二進位制的集合。位運算子提供檢查和設定二進位制位的功能,滿足左結合律。但是位運算關於符號位如何處理沒有明確的規定,改變符號位的值是一種未定義的行為,所以建議僅將位運算子作用於無符號 型。左移運算子 右移運算子 的行為則依賴於其左側運算物件物件的型別 如果該運...

sizeof運算子詳解

1 sizeof應用在結構上的情況 請看下面的結構 struct mystruct 對結構mystruct採用sizeof會出現什麼結果呢?sizeof mystruct 為多少呢?也許你會這樣求 sizeof mystruct sizeof double sizeof char sizeof in...