參考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求算的是所佔的空間,如果作用於表示式,這個表示式是不進行求值的,只根據型別...