一、字節(jié)對(duì)齊
1、什么是對(duì)齊
在線計(jì)算機(jī)內(nèi)存空間都是按照字節(jié)(byte)劃分的,從理論上講似乎任何類型的變量的訪問都可以從任何地址開始纵菌,但是實(shí)際情況在訪問特定的變量的時(shí)候,經(jīng)常在特定的內(nèi)存地址訪問休涤,這就需要各類型數(shù)據(jù)按照一定的規(guī)則在空間上排列咱圆,而不是順序的一個(gè)接一個(gè)的排放,這就是對(duì)齊。
2闷堡、對(duì)齊的好處
為了提高效率隘膘,計(jì)算機(jī)從內(nèi)存中讀數(shù)據(jù)都是按照一個(gè)固定長(zhǎng)度的。以32位機(jī)為例杠览,它每次取32位弯菊,也就是4個(gè)字節(jié)。字節(jié)對(duì)齊的好處踱阿?以int類型為例管钳,如果它在內(nèi)存中存放的位置按4字節(jié)對(duì)齊,也就是說1個(gè)int的數(shù)據(jù)全部落在計(jì)算機(jī)一次取數(shù)的區(qū)間內(nèi)软舌,那么只需要取一次就可以了才漆。
3、如何對(duì)齊
對(duì)齊原則:
- char 偏移量必須為sizeof(char) 即1的倍數(shù),可以任意地址開始存儲(chǔ)
- short 偏移量必須為sizeof(short) 即2的倍數(shù),只能從0,2,4...等2的倍數(shù)的地址開始存儲(chǔ)
- int 偏移量必須為sizeof(int) 即4的倍數(shù),只能從0,4,8...等4的倍數(shù)的地址開始存儲(chǔ)
- float 偏移量必須為sizeof(float) 即4的倍數(shù),只能從0,4,8...等4的倍數(shù)的地址開始存儲(chǔ)
- double 偏移量必須為sizeof(double)即8的倍數(shù),只能從0,8,16...等地址開始存儲(chǔ)
例子:
typedef struct
{
char member1;
int member3;
short member2;
}Family;
這個(gè)結(jié)構(gòu)體:member1占一個(gè)字節(jié),即 0
member2占4個(gè)字節(jié),根據(jù)上面原則,開始存儲(chǔ)地址應(yīng)該是4的倍數(shù),即 4~7
member3占2個(gè)字節(jié),根據(jù)上面原則,開始存儲(chǔ)地址是2的倍數(shù),即 8 ~ 9
總共占用了0 ~ 9 應(yīng)該是10個(gè)字節(jié),但為什么實(shí)際卻是12個(gè)字節(jié)呢 ?
因?yàn)槟J(rèn)對(duì)齊方式是4字節(jié)(至于為什么,往下看),也就是說,總長(zhǎng)度必須是4的倍數(shù),因此長(zhǎng)度既要大于 10,還要是4的倍數(shù),那就是12了.
- 結(jié)構(gòu)體如何設(shè)定字節(jié)對(duì)齊
結(jié)構(gòu)體的總大小,也就是sizeof的結(jié)果,必須是其內(nèi)部最大成員的整數(shù)倍.不足的要補(bǔ)齊.