內(nèi)存對齊主要可以提高cpu的尋址訪問速度,以及方便在各平臺之間移植等作用怠益。
下面介紹一下字節(jié)對齊后struct和union大小計算方式仪搔。舉例:
struct S1{
short j; //2 bytes [0--1]
double k; //8 bytes [8--15]
char a[4]; //4 bytes [16--19]
char c; //1 byte [20]
int d; //4 bytes [24--27]
//為了和double對齊,會自動補(bǔ)齊到bouble的n倍.
};
struct S2{
char i;// 1 byte [0]
short o; //2 bytes [2--3]
int k; //4 bytes [4--7]
double b; //8 bytes [8--15]
};
union U1{
char a[5]; //5 bytes
int b[5]; //20 bytes
double f; //8 bytes
};
int main(int argc, _TCHAR* argv[])
{
int size1 = sizeof(S1);
int size2 = sizeof(S2);
int size3 = sizeof(U1);
return 0;
}
計算結(jié)果如下
size1 = 32
size2 = 16
size3 = 24
為什么呢溉痢,不是應(yīng)該是19, 15憋他, 20嗎孩饼? 不是的,原因是這樣的竹挡。
對于結(jié)構(gòu)體的計算要注意以下幾點:
- 計算偏移量從0開始計算镀娶;
- 當(dāng)前元素的偏移從元素自身大小的整數(shù)倍開始計算。比如S1中K本身大小為8字節(jié)揪罕,那就必須從8字節(jié)的整數(shù)倍開始偏移梯码。比如S2中的K是4字節(jié)大小宝泵,那么它就應(yīng)該從4的整數(shù)倍開始偏移;
- 最后結(jié)果一定是結(jié)構(gòu)體中最大數(shù)據(jù)類型的整數(shù)倍轩娶;
對于Union的計算需要注意這幾點:
- 計算各成員占用字節(jié)數(shù)的大小,占用最大字節(jié)數(shù)的成員記為x儿奶;
- 找出最大數(shù)據(jù)類型的成員所占字節(jié)數(shù)大小,記為y;
- 最后結(jié)果為n*y >= x.
n*y就是最后的結(jié)果鳄抒,n為最小值闯捎。可以理解為许溅,union的大小既能存放占用字節(jié)最大的數(shù)據(jù)成員瓤鼻,也能至少存放n個union中最大數(shù)據(jù)類型的成員。