#include <iostream>using namespace std;//#pragma pack(1) //使用#pragma pack可以將對齊設定為1/*記憶體對齊的3個準則:1、結構體變數的首地址能夠被其最寬的基本類型成員大小所整除2、結構體每個成員相對於結構體首地址的位移量(offset)都是這個成員大小的整數倍,如有不足則補上3、結構體總大小為結構體最寬的基本類型成員的整數倍*/struct widget1{double d;//sizeof(double)== 8int i;//sizeof(int)== 4short s;//sizeof(short)== 2char c;//sizeof(char)== 1static int count;//count是靜態成員,靜態成員的空間不在類的執行個體中,//而是像全域變數一樣在靜態儲存區,被類共用。};int widget1::count = 0;/*對於widget1:d的位移量為0;i的位移量為8,是sizeof(int)的整數倍,不需補位元組s的位移量為8+4=12,是sizeof(short)的整數倍,不需補位元組c的位移量為8+4+2=14,是sizeof(char)的整數倍,不需補位元組目前的結構體的位元組數為8+4+2+1=15,不是最大基本變數d大小的整數倍,需要補上1位元組,15+1=16所以sizeof(widget1)==16*/struct widget2{int i;//sizeof(int)== 4short s;//sizeof(short)== 2char c;//sizeof(char)== 1double d;//sizeof(double)== 8};/*對於widget2:i的位移量為0s的位移量為4,是sizeof(short)的整數倍,不需補位元組數c的位移量為4+2=6,也不需補位元組數d的位移量為4+2+1=7,但不是sizeof(double)的整數倍,要補位元組數1,所以d的位移量為4+2+1+1(補齊)=8目前結構體的位元組數為4+2+1+1(補齊)+8=16,是最大基本變數d大小的整數倍,不需補齊所以sizeof(widget2)==16*/struct widget3{char c;//sizeof(char)== 1int i;//sizeof(int)== 4short s;//sizeof(short)== 2double d;//sizeof(double)== 8};/*對於widget2:c的位移量為0i的位移量為1(c的大小)+3(補齊)=4s的位移量為1(c的大小)+3(補齊)+4(i的大小)=8d的位移量為1(c的大小)+1(補齊)+4(i的大小)+2(s的大小)+6(補齊)=16目前結構體的大小為1(c的大小)+1(補齊)+4(i的大小)+2(s的大小)+6(補齊)+8(d的大小)=24,不需補齊所以sizeof(widget3)=24*/int main(){cout<<"the size of widget is: "<<sizeof(widget1)<<endl;cout<<"the size of widget is: "<<sizeof(widget2)<<endl;cout<<"the size of widget is: "<<sizeof(widget3)<<endl;system("pause");return 0;}