Mình nói là cái alignment của nó tương tự như struct chứ mình không hề nói nó lưu trữ dữ liệu nó giống struct.
Để giải thích rõ cái này phải vẽ hình ra cho bạn thấy thì mới rõ được, nhưng mình lười quá ( sorry bro ). bác chịu khó tưởng tượng 1 chút.
Trên 32bit system. Mỗi thanh ghi sẽ có 32bit tương ứng với 8 byte.
Khi bác khai báo :
union Vietjack
{
int i;
float f;
char chuoi[50];
};
Thì lúc này union cần hệ điều hành cấp cho nó 1 vùng nhớ đủ lớn để lưu trữ được dữ liệu tương ứng. Thì không cần phải là thiên tài cũng thấy 50byte là đủ.
Nhưng nếu cấp cho nó chỉ 50byte thì nó sẽ bị “lẽ”.
bác tưởng tượng nhá. 50byte chia đều cho các thanh ghi, mỗi thanh 8byte thì cần 6 thanh ghi công thêm 2byte của thanh ghi thứ 7 ( 8*6 + 2 = 50 ). Thì lúc này thanh ghi thứ 7 chỉ có 2byte muốn lưu kiểu int hay float ( 4byte ) thì nó cần dùng thêm 2byte của thanh ghi thứ 6 ==> cái chổ lẻ này sẽ làm cho máy tính rất khó trong tính toán và làm giảm hiệu năng. Nên trình biên dịch sẽ tự thêm 2byte vào cho thanh ghi thứ 7 đủ 4byte ==> vừa khít để lưu kiểu int, float trên cùng 1 thanh ghi. Do đó, kết quả sẽ là 50 + 2 = 52.
Bonus thêm:
Nếu cũng union như trên, bác đổi lại char chuoi[8]; thì size của union là 8. Nếu char chuoi[9]; thì… là 12. và char chuoi[10]; char chuoi[11]; char chuoi[12]; đều cho size là 12.!!!