结构体对齐
結構體對齊
C/C++數據對齊
為了避免混淆,做如下規定,以下代碼若不加特殊說明都運行于32位平臺,結構體的默認對齊值是8,各數據類型所占字節數分別為
char占一個字節
int占四個字節
double占八個字節。
兩個例子
請問下面的結構體大小是多少?
struct Test {char c ;int i ; };這個呢?
struct Test1 {int i ;double d ;char c ; };在公布答案之前先看一下對齊的規則。
對齊規則
一般來說,結構體的對齊規則是先按數據類型自身進行對齊,然后再按整個結構體進行對齊,對齊值必須是2的冪,比如1,2, 4, 8, 16。如果一個類型按n字節對齊,那么該類型的變量起始地址必須是n的倍數。比如int按四字節對齊,那么int類型的變量起始地址一定是4的倍數,比如0x0012ff60,0x0012ff48等。
?
數據自身的對齊
數據自身的對齊值通常就是數據類型所占的空間大小,比如int類型占四個字節,那么它的對齊值就是4
整個結構體的對齊
整個結構體的對齊值一般是結構體中最大數據類型所占的空間,比如下面這個結構體的對齊值就是8,因為double類型占8個字節。
struct Test2 {int i ;double d ; };例子答案
有了上面的基礎,再回過頭去看看一開始的兩個例子
先看結構體Test
1 c是char類型,按1個字節對齊
2 i是int類型,按四個字節對齊,所以在c和i之間實際上空了三個字節。
整個結構體一共是1 + 3(補齊)+ 4 = 8字節。
再看Test1
i是int類型,按4字節對齊
d是double類型,按8字節對齊,所以i和d之間空了4字節
c是char類型,按1字節對齊。
所以整個結構體是 4(i) + 4(補齊)+ 8(d) + 1(c) =? 17字節,注意!還沒完,整個結構體還沒有對齊,因為結構體中空間最大的類型是double,所以整個結構體按8字節對齊,那么最終結果就是17 + 7(補齊) = 24字節。
書寫結構體的建議
我們對Test1做一點改動
struct Test1 {char c ;int i ;double d ; };這時Test1的大小就變成了16,而不是24了,節省了8個字節!可見結構體中成員的書寫順序對結構體大小的影響還是很大的,一個好的建議是,按照數據類型由小到大的順序進行書寫。http://www.cnblogs.com/graphics/archive/2010/08/12/1797953.html
總結
- 上一篇: 结构体中的malloc 与 free
- 下一篇: 更改结构体的内存字节对齐方式--经典