請讓我再補充
一般CPU都有data alignment。例如32-bit data嘅naturally aligned address係可以除得盡4,16-bit data嘅aligned address係除得盡2,8-bit (byte)data係任何address都一定aligned。如果data mis-aligned,memory access可能有performance penalty因為hardware有機會要用多過一個memory access。舊嘅RISC CPU甚至會有alignment exception會crash program。現代高效能CPU一般唔過cache line boundary(32b/64b)misalignment都唔會有penalty。
由於alignment關係,一般structure嘅data field一般都係naturally aligned,而且成個struct會跟裡面最大個data alignment。例如個struct最大係16-bit data,咁個struct size一定會係2嘅倍數。如果最大係64-bit,咁個struct size係8嘅倍數。
要data field align就要加padding,但padding同之後個field嘅alignment有關。
struct{
bool a;
bool a2;
int b;
}
如果int係32-bit,咁呢個例子同手巴個struct一樣咁大,a同a2中間唔需要padding,但a2同b間要加兩個byte嘅padding space。