1.什么叫對齊?
在C/C++中,數據結構或類的成員變量,并不是按照它們的大小,一個一個緊湊地排列在空間上的。它們是按照一種特定的方法排列的,有可能在兩個成員變量之間插入一個或個byte,以保證每個成員變量的起始位置是都是從某些特定的位置開始的。這就是對齊。單純從語言上描述對齊有些枯燥難以理解,下文將配以例子說明C/C++是基于什么樣的規則對齊的
2.為什么要對齊?
1.在大多數平臺上,系統從某些特定的位置開始讀數據非常快,而從其它位置讀數據會慢很多。C/C++是一種注重效率的語言,為了使程序速度盡可能地快,選擇犧牲很少的空間,用填充byte的方式保證所有數據的存儲都從這些特定的位置開始,而達到較高的運行速度
2.便于移植,有些系統不支持某些地址的訪問。
3.對齊規則
(1)結構體的起始地址能被n整除
(2)結構體的總大小能被n整除
當說到一個成員變量是n字節對齊的,說明該變量的起始地址能被n整除。比如某變量的對齊字節數是4,那么它的首地址的16進制形式一定是以0/4/8/C結尾的。
一般情況下 C/C++ 的變量所占用的字節數
char: ? ?1字節;
short: ? 2字節;
int: ? ? ? 4字節;
long: ? ?4字節;
long long: 8字節;
float: ? ?4字節;
double: 8字節;
bool: ? ?1字節;
指針:(32位系統4字節,64位系統8字節)
聯合:
①聯合就是一個結構,②它的所有成員相對于基地址的偏移量都為0,③此結構空間要大到足夠容納最“寬”的成員,④并且,其對齊方式要適合于聯合中所有類型的成員。
怕有的兄弟還不明白,特附圖一個幫助理解:
該結構要放得下int i[5]必須要至少占4×5=20個字節。如果沒有double的話20個字節夠用了,此時按4字節對齊。但是加入了double就必須考慮double的對齊方式,double是按照8字節對齊的,所以必須添加4個字節使其滿足8×3=24,也就是必須也是8的倍數,這樣一來就出來了24這個數字。綜上所述,最終聯合體的最小的size也要是所包含的所有類型的基本長度的最小公倍數才行。(這里的字節數均指winnt下的值,平臺、編譯器不同值也有可能不同。)
參考:
1.C++里的對齊規則 - 幸福在路上 - 博客頻道 - CSDN.NET http://blog.csdn.net/mishifangxiangdefeng/article/details/48378879
2.union 類型 內存對齊 - yuliying的專欄 - 博客頻道 - CSDN.NET http://blog.csdn.net/yuliying/article/details/48781087