C sizeof用法總結

2021-09-24 13:14:39 字數 2716 閱讀 3483

sizeof是乙個操作符(operator)。

其作用是返回乙個物件(包括變數和表示式,將轉換為對相應型別)或型別所佔的記憶體位元組數。注意sizeof是右結合操作符,在編譯時計算。

sizeof有三種語法形式:

sizeof (type_name); //sizeof (型別)

sizeof (object); //sizeof (物件)

sizeof object; //sizeof 物件

物件可以是各種型別的變數,以及表示式(一般sizeof不會對表示式進行計算)。

sizeof對物件求記憶體大小,最終都是轉換為對物件的資料型別進行求值。

sizeof (表示式); //值為表示式的最終結果的資料型別的大小。

sizeof不能對void型別進行求值。

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 array[sizeof(int) * 10]; //ok,編譯無誤

基本資料型別的sizeof

這裡的基本資料型別是指char(1)、short(2)、int(4)、long(4)、float(4)、double(8)這樣的簡單內建資料型別。

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

陣列的sizeof

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

注意:1)當字元陣列表示字串時,其sizeof值將』/0』計算進去。 2)當陣列為形參時,其sizeof值相當於指標的sizeof值。

char a[10];  

char b = "abc";

int * n[5];

cout<<"char a[10]"《指標的sizeof

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

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

指標變數的sizeof值與指標所指的物件沒有任何關係,因此空指標也可以使用sizeof。

//32位系統下

char *b = "helloworld";

char *c[10];

double *d;

int **e;

void (*pf)();

cout<<"char *b = /"helloworld/""《函式的sizeof

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

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

注意:1)不可以對返回值型別為空的函式求值。 2)不可以對函式名求值。 3)對有引數的函式,在用sizeof時,須寫上實參表。

#include using namespace std;

float funcp(int a, float b)

int funcnp()

void func()

int main()

;

sizeof(u); //值為8

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

struct s4

sizeof(s4); //值為12,b的起始位置是4的整數倍(b內部最大元素大小int),佔8個位元組

class的sizeof

沒有成員變數

class a

;cout對vector等容器物件進行sizeof運算,只會返回該類固定部分的大小,不會計算容器中元素占用空間。

C sizeof的使用總結

說明 以下 在 vs2008 中通過,在 32位作業系統下。1.定義 sizeof 是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為 size t size t 在標頭檔案 stddef.h 中定義,它依賴於編譯系統的值,一般定義為 typedef un...

c sizeof 的使用總結

說明 以下 在 vs2008 中通過,在 32位作業系統下。1.定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為size t。size t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigne...

C sizeof的使用總結

說明 以下 在 vs2008 中通過,在 32位作業系統下。1.定義 sizeof是乙個操作符 operator 其作用是返回乙個物件或型別所佔的記憶體位元組數。其返回值型別為size t。size t在標頭檔案stddef.h中定義,它依賴於編譯系統的值,一般定義為 typedef unsigne...