sizeof()計算

本節包含sizeof()計算結構體,位域,數組,字符串,指針,c++中的class等類型的大小,sizeof()計算的大小都是以字節爲單位。html

一 計算基本類型的長度c++

sizeof(char): 1windows

sizeof(short): 2數組

sizeof(int): 4函數

sizeof(long): 4(win X86 和 win X64長度都爲4, Linux X86長度爲4,Linux X64爲8)spa

sizeof(float):4設計

sizeof(double):8指針

sizeof(bool):1(在C++里長度爲4)code

sizeof(BOOL):4 (在windows平臺長度爲4)htm

sizeof(p):指針類型在X86長度爲4,X64長度爲8,如char *p

 

二 計算結構體的長度

  要正確計算sizeof(結構體)的大小,須要理解和掌握數據對齊的概念。數據對齊的概念在前面內存中的數據對齊  和 天然對齊和強制對齊有介紹。

 關鍵是記住天然對齊和強制對齊的對齊規則,計算sizeof(結構體)的大小就很簡單了。

三 計算數組長度

  char str[] = "hello";  sizeof(s)大小是多少

1 普通狀況

  str是字符數組,由字符串"hello"初始化,"hello"; 共5個字符,又字符串以 '\0' 結尾。因此str數組的長度是6

  sizeof(s)爲6

2 str數組作函數參數

  在函數裏,數組str做爲參數傳進來,在函數內部str是指針的形式。因此:

  sizeof(s)爲4  X86平臺

  sizeof(s)爲8  X64平臺

四 計算union的長度

  在使用sizeof計算union類型的時候,整個union結構的大小等於union中最大成員的大小,而且必須是最大類型的整數倍。

例如:
typedef union 
{
    long i; 
    int k[5];
    char c;
} DATE;
struct data 
{
    int cat; 
    DATE cow; 
    double dog;
} too; 
DATE max; sizeof(struct data) = ?sizeof(max))=?
分析:
因爲max是union DATE類型,那麼其中最大的成員爲k,因此sizeof(MAX)=k成員的長度=5*sizeof(int)=20
對於struct data結構體,按照天然對齊方法,計算出結果爲:sizeof(struct data)=4+20+8=32

五 計算位域結構的大小

  位域結構的大小在位域(位段)有介紹。

六 計算類和對象的大小 (C++中)

class A
{
public:
    A();
    ~A();

private:

};

void main()
{
    printf("sizeof(A): %d\n", sizeof(A));
    getchar();
}

sizeof(A) = 1。由於類的實例化就是給每一個實例在內存中分配一塊內存地址。空類被實例化時,會由編譯器隱含得添加一個字節,因此爲1。

class B
{
    void fn1();
    void fn2();
protected:
    char a;
    char b;
    int c;
    static int d;
};

sizeof(B) = 8。
類B中最大類型是int。a長度1字節,b長度1字節,int型c內存地址必須能夠被4整除,static變量d不影響類的大小。

因此sizeof(B) = 變量a的長度1 + b的長度1 + 對齊2字節 + 變量c的長度4字節 = 8

 

class A
{
protected:
    int a;
private:
    int b;
};
class B :public A
{
private:
    int c;
};

sizeof(B) = 12  B繼承A,因此B中包含了A中的全部數據,大小爲A內的大小8+B內的大小4 = 12 

 

class C
{
    virtual void fun(){}
};

sizeof(C) = 4   由於類C中包含一個指向虛函數表的指針。

 

class D
{
    virtual void fun1()    {}

    virtual void fun2() {}
};

sizeof(D) = 4 多個虛函數只須要一個指向虛函數表的指針

七 sizeof與strlen

char *p1 = "12345678"; 
char p2[] = "12345678"; 
char p3[1024]="12345678"; 
char p4[] = {'1','2','3','4','5','6','7','8'}; 

sizeof(p1)=? 
sizeof(p2)=? 
sizeof(p3)=? 
sizeof(p4)=? 

strlen(p1)=? 
strlen(p2)=? 
strlen(p3)=? 
strlen(p4)=? 

分析: 
p1是一個字符指針,指向了靜態常量區的一個常量字符串,"12345678"。因此,sizeof(p1)=指針的長度=4;strlen(p1)=字符串"12345678"的長度(不含'\0'),因此是8。 
p2是一個字符數組,由靜態常量區的"12345678"進行初始化。因此sizeof(p2)是計算數組p2的長度,因此結果爲"12345678"的全部字符的長度(含'\0'),因此是9。 strlen(p2)也是在計算"12345678"的長度(不含'\0'),因此是8。 
p3是一個字符數組,由靜態常量區的"12345678"進行初始化,但長度爲1024。 因此,sizeof(p3)=1024;strlen(p3)爲字符串"12345678"的長度(不含'\0'),因此是8。 
p4是一個字符數組,由字符'1','2','3','4','5','6','7','8'進行初始化, 這樣初始化與"12345678"進行初始化的區別是 前者不包含'\0'。所以,sizeof(p4)=8。因爲p4做爲一個字符數組,並不以'\0'結尾, 因此strlen(p4)在計算字符串長度的時候,找不到結束符'\0',會發生字符串溢出。 
因此,最後答案爲: 
sizeof(p1)=4 
sizeof(p2)=9 
sizeof(p3)=1024 
sizeof(p4)=8 
strlen(p1)=8 
strlen(p2)=8 
strlen(p3)=8 
strlen(p4)=字符串溢出,值不肯定,甚至會引發程序崩潰 

八 sizeof其它

題目1:請設計一個宏,用來計算數組的長度。解:#define ARRAYLEN(a) sizeof(a)/sizeof(a[0])題目2:sizeof是函數嗎?是在程序編譯的時候計算的仍是運行時?解:sizeof是操做符而不是函數。sizeof是在程序編譯的時候就計算完成了,而不是在程序運行的時候計算。

相關文章
相關標籤/搜索