(不記得從哪裏讀到的)
字節對齊是指變量的起始地址將滿足某種特性,以達到更高的訪問效率。
#pragma pack(N):
基本數據類型變量m的對齊方式是M(M=min(N,sizeof(m)))字節對齊,即變量m的起始地址必須是M的整數倍;
當N大於m的長度時,按m長度進行字節對齊,不會有什麼問題;
當N小於m時,變量按N字節對齊,此時可能導致問題;
對於指針類型變量,起始地址爲4的整數倍(32位)或8的整數倍(64位)爲最佳,函數指針非自然對齊時,有的編譯器會報錯,有的編譯時不報錯但執行會coredump。
總之,沒有苛刻的空間要求,代碼均要採用字長等量對齊,32位程序4字節對齊,64位程序8字節對齊,這樣不僅安全,而且執行效率高。自然對齊方法:
#ifdef HP_UNIX
#ifdef _64_BIT_
#pragma pack 8
#else
#pragma pack 4
#endif
#elif defined(AIX)
#pragma options align=natural
#else
#ifdef _64_BIT_
#pragma pack(8)
#else
#pragma pack(4)
#endif
#endif
另:結構體成員變量自然對齊是按最大成員對齊,不足的填充補齊。
當定義消息結構體時,消息發送方、接收方一定要使用相同的對齊方式,否則無法正確解析消息內容。