參考c++primer
sizeof運算符返回一條表達式或一個類型名字所佔的字節數。滿足右結合律,返回類型size_t的常量表達式
兩種形式:
1.sizeof (type)
2.sizeof expr //返回表達式結果類型大小
sizeof並不實際計算其運算對象的值
class Sales_data
{
public:
int revenue();
private:
string isbn;
double price;
}
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)是:
Struct A
{
Int a;short b;int c;char d;
};
Struct B
{int a;short b;char d;int c;};
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