天天看點

C++程式設計基礎(5)sizeof的使用

1.知識點

(1)sizeof是一個單目運算發,而不是一個函數,其用于擷取操作數所占記憶體空間的位元組數。

(2)sizeof的操作數可以使類型名,也可以是表達式,如果是類型名則直接獲得該類型所占位元組數,如果是表達式,則先分析表達式結果的類型,再根據類型确定所占位元組數,并不對表達式進行實際計算。

1 int a = 1;
2 double b = 1.5;
3 sizeof(int);//結果為4
4 sizeof(a);    //結果為4
5 sizeof(b);    //結果為8      

(3)sizeof很少單獨使用,而是和記憶體配置設定或者計算法數組長度等需求進行配合使用。

1 //與記憶體空間配置設定配合使用
2 int *ptr = (int *)malloc(sizeof(int) * 20);
3 //與計算數組長度配合使用
4 int count = sizeof(darray) / sizeof(double);      

(4)數組名作為操作數時,将獲得整個數組所占空間,當數組名作為實參傳遞給子函數時,此時數組名已經成為了指針,其計算結果将是指針的所占空間。

void subfunc(double darray[]) {
    cout << sizeof(darray) / sizeof(double) << endl;    //輸出4/8=0
}
int main(int argc, char *argv[]) {
    double darray[20];
    cout << sizeof(darray) / sizeof(double) << endl;        //輸出16/8=20
    subfunc(darray);
    getchar();
    return 0;
}      

(5)在計算字元串長度時要用strlen。sizeof是一個運算符,用于擷取類型或表達式的所占記憶體大小;strlen是一個函數,用于計算字元串中字元的個數,其中字元串結尾符\0不會被計算在内。

2.面試題

2.1不能使用sizeof計算的表達式

1 struct baby
 2 {
 3     unsigned int gender : 1;
 4     unsigned int weight : 5;
 5     unsigned int week : 7;
 6     unsigned int blood : 3;
 7     unsigned int height : 8;
 8 };
 9 int triple(int number) {
10     return 3 * number;
11 }
12 int main(int argc, char *argv[]) {
13     sizeof(baby);    //A
14     sizeof(baby.gender);//B
15     sizeof(triple);//C
16     sizeof(triple(3));//D
17     sizeof(show());//E
18 
19     getchar();
20     return 0;
21 }      

答案:正确:A,D;錯誤:B,C,E.

(1)sizeof計算結構體是結果是結構體的所占記憶體空間,結構體中使用了位域定義成員,要求一個位域成員不能橫跨兩個位元組,故可以算出該結構體的位元組數為4,A正确。

(2)sizeof計算的結果是位元組數,但是不允許計算結構體中某個位域成員的所占空間,當然如果不是位域定義的是可以計算的。故B錯。

(3)不允許計算函數名的所占位元組數大小,有點莫名其妙,C錯。

(4)允許計算表達函數表達式,其結果是函數傳回值的類型的位元組數,即該題的int大小,D正确。

(5)函數傳回值類型不确定使,不允許通過sizeof計算,故E錯誤。

2.2sizeof計算結構體是的記憶體對其問題

寫出下面兩個結構體的sizeof計算結果

struct s1{
    char a;//1
    short b;//4
    int c;//8
    double d;//16,16剛好是double大小的整數倍
};
struct s2 {
    char a;//1
    short b;//4
    double c;//16(從9開始排)
    int d;//20(該結果不是double的整數倍,故需要加到24)
};      

資料對其總結:(1)每個成員在記憶體中的起始位置都必須是自身大小的整數倍。

(2)最終結構體計算結果必須是占位元組數最大的成員的整數倍。

答案:16,24。

2.3結構體嵌套時的sizeof計算

1 struct s1 {
 2     int a;
 3 };
 4 struct s2 {
 5     char a[4];
 6 };
 7 struct s3{
 8     char a[4];
 9     char b;
10 };
11 struct s4 {
12     s1 a;
13     char b;
14 };
15 struct s5{
16     s2 a;
17     char b;
18 };      

含複雜結構體的資料對其總結:在資料對其時,要以結構體中最深層的基本資料類型為準。例如:如果結構體成員是一個數組,應以數組的元素的類型作為資料對其的标準,如果結構體成員是其他結構體,應以内層結構體中的基本元素類型成員作為外層結構體資料對齊的标準。故答案如下

1 sizeof(struct s1)=4;
2 sizeof(struct s2)=4;
3 sizeof(struct s3)=5;
4 sizeof(struct s4)=8;
5 sizeof(struct s5)=5;      

繼續閱讀