sizeof運算符詳解

參考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





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章