C 中的sizeof函式

2021-07-22 03:18:47 字數 2603 閱讀 3472

c++中的sizeof()函式我們常常會見到,但是更多的是只是熟悉,而並沒有真正的了解過,下面就對這個函式做乙個深入的介紹。

sizeof是c/c++中的乙個操作符(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

這是對於sizeof函式做的乙個簡單的例子,下面就分幾種型別來總結一下:

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,空結構體也佔記憶體。

聯合體的sizeof

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

例子:

union u  

; sizeof(u); //值為8

陣列的sizeof

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

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

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

例子1:

char a[10];  

char n = "abc";

cout

<<"char a[10] "

<<"char n = /"abc/" "

int funcnp()

void func()

int main()

例子:

class a

;class b

~b() {}

};class c

virtual ~c() {}

};int _tmain(int argc, _tchar* argv)

得到的結果是1, 1, 4 class a是乙個空型別,它的例項不包含任何資訊,本來求sizeof應該是0。但當我們宣告該型別的例項的時候,它必須在記憶體中占有一定的空間

C語言sizeof 函式

用來查詢型別或物件在記憶體中所佔的位元組數。unsign int 無符號整型 sizeof type name sizeof 型別 object sizeof object 物件舉例 int i 0 sizeof int ok sizeof int error sizeof i ok sizeof ...

c 中sizeof的用法

1 作用 sizeof計算資料 包括陣列 變數 型別 結構體等 所佔記憶體空間,用位元組數表示。2 sizeof有三種用法形式,sizeof操作符,對變數或物件可以不加括號,但若是型別,須加括號 如下 1 sizeof object 物件 2 sizeof type name 型別 3 sizeof...

C中sizeof的用法

之前學習c語言,對於其中的很多細節問題都沒有了解的很清楚,都囫圇吞棗的過去了,每次看到各個公司出的筆試面試題的時候,才發現自己的c語言基礎中漏洞百出,今天就其中的乙個漏洞 sizeof好好的彌補一下,如有不當,敬請指出。sizeof,計算資料空間的大小,它不是函式,而是一種單目運算子。sizeof,...