見到N多的筆試題目考到相關內容,作題目時老是非常迷糊,索性一怒,狂看,終於有所得。
在這做個總結:
一、VC預設的位元組對齊:
1.資料成員對齊規則:
在預設情況下,VC規定各成員變數存放的起始地址相對於結構的起始地址的位移量:sizeof(類型)或其倍數
2.整體對齊規則:
結構的總大小也有個約束條件:最大sizeof(類型)的整數倍
如:struct MyStruct
{
char dda;
double dda1;
int type
};//sizeof=1+7+8+4+4=24
二、自己設定位元組對齊
VC中提供了#pragma pack(n)來設定變數以n位元組對齊。
1.資料成員對齊規則:
n位元組對齊就是說變數存放的起始地址的位移量:min(sizeof(類型),對齊)或其倍數.
2.整體對齊規則:
結構的總大小也有個約束條件:min(最大的sizeof(類型),對齊)的倍數.
#pragma pack(push) //儲存對齊狀態
#pragma pack(4)//設定為4位元組對齊
struct test
{
char m1; //預設位移量
double m4;//非預設位移量
int m3; //預設位移量
}; //sizeof=1+3+8+4=16應為4的倍數
#pragma pack(pop)//恢複對齊狀態
#pragma pack(push) //儲存對齊狀態
#pragma pack(16)//設定為4位元組對齊
struct test
{
char m1;//預設位移量
double m4;//預設位移量
int m3;//預設位移量
}; //sizeof=1+7+8+4+4=24應為8的倍數。
#pragma pack(pop)//恢複對齊狀態
三、sizeof簡單應用
1. 參數為資料類型或者為一般變數。
例如sizeof(int),sizeof(long)等等。
這種情況要注意的是不同系統系統或者不同編譯器得到的結果可能是不同的。例如int類型在16位系統中佔2個位元組,在32位系統中佔4個位元組。
2. 參數為數組或指標。下面舉例說明.
int a[50]; //sizeof(a)=4*50=200; 求數組所佔的空間大小
int *a=new int[50];// sizeof(a)=4; a為一個指標,sizeof(a)是求指標的大小,在32位系統中,當然是佔4個位元組。
3. 參數為結構或類。
Sizeof應用在類和結構的處理情況是相同的。
但有兩點需要注意,第一、結構或者類中的靜態成員不對結構或者類的大小產生影響,因為靜態變數的儲存位置與結構或者類的執行個體地址無關。
第二、沒有成員變數的結構或類的大小為1,因為必須保證結構或類的每一個執行個體在記憶體中都有唯一的地址。
下面舉例說明,
Class Test{int a;static double c};//sizeof(Test)=4.
Test *s;//sizeof(s)=4,s為一個指標。
Class test1{ };//sizeof(test1)=1;
4. 參數為其他。下面舉例說明。
int func(char s[5]);
{
cout<<sizeof(s);
//這裡將輸出4,本來s為一個數組,但由於做為函數的參數在傳遞的時候系統處理為一個指標,所以sizeof(s)實際上為求指標的大小。
return 1;
}
sizeof(func(“1234”))=4//因為func的傳回型別為int,所以相當於//求sizeof(int).
四、sizeof(含位域的結構體)
使用位域的主要目的是壓縮儲存,其大致規則為:
1) 如果相鄰位域欄位的類型相同,且其位寬之和小於類型的sizeof大小,則後面的欄位將緊鄰前一個欄位儲存,直到不能容納為止;
2) 如果相鄰位域欄位的類型相同,但其位寬之和大於類型的sizeof大小,則後面的欄位將從新的儲存單元開始,其位移量為其類型大小的整數倍;
3) 如果相鄰的位域欄位的類型不同,則各編譯器的具體實現有差異,VC6採取不壓縮方式,Dev-C++採取壓縮方式;
4) 如果位域欄位之間穿插著非位域欄位,則不進行壓縮;
5) 整個結構體的總大小為最寬基本類型成員大小的整數倍。
測試:
struct test
{
char a:1;
char :2;
long b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1+3+4+1+3=12
struct test
{
char a:1;
char :2;
char b:3;
long c:2;
};
test t1;
int len=sizeof(t1); //len=1+3+4=8
struct test
{
char a:1;
char :2;
char b:3;
char c:2;
};
test t1;
int len=sizeof(t1); //len=1
轉自:清平樂--百度空間
http://hi.baidu.com/gaomanyi/blog/item/9cf279638b96cb660d33fad0.html