sizeof運算子詳解

2021-06-25 16:07:33 字數 1687 閱讀 7057

參考c++primer

sizeof運算子返回一條表示式或乙個型別名字所佔的位元組數。滿足右結合律,返回型別size_t的常量表示式

兩種形式:

1.sizeof (type)

2.sizeof expr //返回表示式結果型別大小

sizeof並不實際計算其運算物件的值

class sales_data

sales_data data,*p;

sizeof(sales_data);//儲存sales_data型別的物件所佔的空間大小

sizeof data   //data 的型別的大小,即sizeof(sales_data)

sizeof p;//指標所佔的空間大小

sizeof *p //p所指型別的空間大小,即sizeof(sales_data)

首先因為sizeof滿足右結合律且與*運算子的優先順序一樣,故等價於 sizeof (*p),,其次因為sizeof不會實際求運算物件的值,故即使p是乙個無效的指標(未初始化)也不會影響什麼。在sizeof的運算物件中解引用乙個無效的指標仍然是一種安全的行為,因為指標實際上沒有被真正的使用。sizeof不需要真正的解引用指標也能知道它所指物件的型別。

sizeof data.revenue  //sales_data的revenue成員對應型別的大小

sizeof sales_data::revenue //另一種獲取revenue大小的方式

sizeof運算子的結果部分依賴於其作用的型別

1.對char或者型別為char的表示式結果為1

2.對引用型別得到引用物件所佔空間的大小

3對指標得到指標本身所佔空間的大小

4對解引用得到指標所指向的物件所佔空間的大小,指標不需要有效

5 對陣列得到整個陣列所佔空間的大小,登家園對陣列中所有元素個執行一次sizeof運算,並將所得求和。注意:sizeof不會講陣列轉化為指標來處理

6對string物件或vector物件執行sizeof運算只返回型別固定部分的大小,不會計算物件中的元素占用了多少空間。

sizeof(ia)/sizeof(*ia)//返回ia的元素個數

constexpr size_t sz=sizeof(ia)/sizeof(*ia)

int arr2[sz]//正確,sizeof返回常量表示式

16:在32為系統環境,編譯選項為4位元組對齊,那麼sizeof(a)和sizeof(b)是:

structa;

structb;

a: 16,16

b:13,12

c:16,12

d:11,16

sizeof(a)=4+2+2(為了對齊空出來)+4+1+3(為了對齊空出來的)=16;sizeof(b)=4+2+2(足以儲存char,故追加後面)+4=12

sizeof運算子詳解

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

(24)位運算子 sizeof運算子

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

關於sizeof運算子

1 sizeof運算子 sizeof是乙個特殊的運算子,它有兩種形式 sizeof 表示式和sizeof 型別名 對於sizeof運算子要注意幾點 1 如果是表示式的話,括號可以省略,但是對於型別,括號不能省 2 sizeof求算的是所佔的空間,如果作用於表示式,這個表示式是不進行求值的,只根據型別...