天天看點

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

// Example of the sizeof keyword   

size_t  i = sizeof( int );    

struct align_depends {   

    char c;   

    int i;   

};   

size_t size = sizeof(align_depends);  // The value of size depends on    

                                   //  the value set with /Zp or    

                                   //  #pragma pack   

int  array[] = { 1, 2, 3, 4, 5 };     // sizeof( array ) is 20    

                                      // sizeof( array[0] ) is 4    

size_t  sizearr =                        // Count of items in array   

   sizeof( array ) / sizeof( array[0] );  

  <!----> <script src="ms-its:dsmsdn.chm::/html/msdn_footer.js"></script> <!---->

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

int a;   

sizeof(a); // = 4   

sizeof(int); // = 4   

sizeof(1); // = 4  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

void fn() { }   

sizeof(fn); // error:函數   

sizeof(fn()); // error:不能确定類型   

struct S   

{   

    int a : 3;   

};    

S sa;     

sizeof( sa.a ); // error:位域成員  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

int a = -1;   

sizeof(a=3); // = sizeof(a) = sizeof(int) = 4   

cout<<a<<endl; // 輸出-1。由于“=”操作符傳回左操作數的類型,指派操作沒有執行。  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

sizeof(int);        // = 4   

sizeof(double);     // = 8   

sizeof(char);       // = 1   

sizeof(bool);       // = 1   

sizeof(short);      // = 2   

sizeof(float);      // = 4   

sizeof(long);       // = 4  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

sizeof(int *);         // = 4   

sizeof(double *);      // = 4   

sizeof(char *);        // = 4  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

int ai[] = {1, 2};   

sizeof(ai);          // = 2*4 = 8  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

char ac[] = "abcd";  //注意數組末尾的字元串終結符'\0'   

sizeof(ac);          // = 5*1 = 5   

sizeof("abcd");      // = 5*1 = 5  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

int *pi = new int[10]; //這是指針   

sizeof(pi);            // = 4   

int ai[10];   

int *p = ai;           //這還是指針   

sizeof(p);             // = 4   

double* (*a)[3][6];    //看成(double *) (*a)[3][6],即一個3×6的二維數組,數組元素為指針,指向double類型。   

sizeof(a);             // = 4,a為指向上述二維數組的指針   

sizeof(*a);            // = sizeof(double *)*3*6 = 72,*a表示上述二維數組       

sizeof(**a);           // = sizeof(double *)*6 = 24,**a即*(*a),表示double*[6],是元素為double指針的一維數組。   

sizeof(***a);          // = sizeof(double *) = 4,表示上述一維數組中的第一個元素,元素類型為double指針。   

sizeof(****a);         // = sizeof(double) = 8,表示上述數組首元素指向的double類型。  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

void acf(char p[3])     //參數類型是int[],表示指向int的指針   

    sizeof( p );        // = 4   

}   

void aif(int p[])       //參數類型是int[],表示指向int的指針   

void pif(int (*p)[6])   //參數類型是int (*)[6],表示指向int數組的指針   

    sizeof( p);         // = 4   

    sizeof( *p );       // = sizeof(int)*6 = 24   

void ppf(int *p[6])     //參數類型是int *[],表示指向int指針的指針   

    sizeof( *p );       // = 4   

}  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

class CEmpty { };   

sizeof(CEmpty); // = 1   

struct SEmpty { };   

sizeof(SEmpty); // = 1  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

class CInt : public CEmpty {   

sizeof(CInt); // = 4;   

class CFunc {   

    void f() {}   

sizeof(CFunc); // = 1;   

struct SInt : SEmpty {   

    static int i;   

sizeof(SInt); // = 1;  

1)結構體變量的首位址能夠被其最寬基本類型成員的大小所整除;

2)結構體每個成員相對于結構體首位址的偏移量(offset)都是成員大小的整數倍,如有需要編譯器會在成員之間加上填充位元組(internal adding);

3)結構體的總大小為結構體最寬基本類型成員大小的整數倍,如有需要編譯器會在最末一個成員之後加上填充位元組(trailing padding)。

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SByte1   

    double d;    // 偏移量0~7   

    char j;      // 偏移量8   

    int a;       // 偏移量12~15,由于9不能整除4,故先填充9~11   

sizeof(SByte1);  // = 16   

struct SByte2   

{         

    char j;      // 偏移量0   

    double d;    // 偏移量8~15,由于1不能整除8,故先填充1~7   

    int a;       // 偏移量16~19   

sizeof(SByte2);  // = 24,為了湊成8的倍數,填充20~23  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

#pragma pack(push) //儲存對齊狀态   

#pragma pack(4)    //設定為4位元組對齊   

class CByte   

    char c;        //偏移量0   

    double d;      //偏移量4~11,由于1不能整除4,故先填充1~3   

    int i;         //偏移量12~15   

#pragma pack(pop)  //恢複對齊狀态   

sizeof(CByte); // = 16  

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SBit1   

    char a : 3;   

    char b : 4;   

    char c : 5;   

sizeof(SBit1); // = (3+4+1+5+3) bits = 2 bytes  

SBit1:| a × 3+ b × 4 + # × 1 | c × 5 + # × 3 |

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SBit2   

    char   : 0;   // 空域   

sizeof(SBit2); // = (3+4+1+5+3) bits = 3 bytes  

SBit2:| a ×3 + # × 5 | b × 4 + # × 4 | c × 5 + # × 3 |

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SBit3   

    char  a : 3;   

    short b : 4;   

    char  c : 5;   

sizeof(SBit3); // = 6 bytes,由于相鄰位域類型不同,在VC6中其sizeof為6,在Dev-C++中為2。  

SBit3(不壓縮):| a ×3 | # ×8 |b × 4 + # ×4 | # ×8 | c ×5 + # ×3 | # ×8 | 

SBit3(壓縮):| a×3 + b ×4 + # ×1 |   c ×5 + # ×3 |

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SBit4   

    int b : 4;   

    int c;   

sizeof(SBit4); // = 8 bytes  

SBit4:| a×3 + b ×4 + # ×1 | # ×8 | # ×8 | # ×8 | c ×8 | c ×8 | c ×8 | c ×8 |

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

struct SBit5   

    int b;   

    int c : 5;   

sizeof(SBit5); // = 12 bytes  

SBit5:| a×3 + # ×5 | # ×8 | # ×8 | # ×8 | b ×8 | b ×8 | b ×8 | b ×8 | c ×5 + # ×3 | # ×8 | # ×8 | #×8 |

深入了解計算機各種類型大小(sizeof)深入了解計算機各種類型大小(sizeof)

union U   

    double d;   

sizeof(U); // = Max(sizeof(i), sizeof(c), sizeof(d)) = sizeof(d) = 8  

繼續閱讀