
// 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> <!---->

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

void fn() { }
sizeof(fn); // error:函數
sizeof(fn()); // error:不能确定類型
struct S
{
int a : 3;
};
S sa;
sizeof( sa.a ); // error:位域成員

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

sizeof(int); // = 4
sizeof(double); // = 8
sizeof(char); // = 1
sizeof(bool); // = 1
sizeof(short); // = 2
sizeof(float); // = 4
sizeof(long); // = 4

sizeof(int *); // = 4
sizeof(double *); // = 4
sizeof(char *); // = 4

int ai[] = {1, 2};
sizeof(ai); // = 2*4 = 8

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

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類型。

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
}

class CEmpty { };
sizeof(CEmpty); // = 1
struct SEmpty { };
sizeof(SEmpty); // = 1

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)。

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

#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

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 |

struct SBit2
char : 0; // 空域
sizeof(SBit2); // = (3+4+1+5+3) bits = 3 bytes
SBit2:| a ×3 + # × 5 | b × 4 + # × 4 | c × 5 + # × 3 |

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 |

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 |

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 |

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