我对整个'数据对齐'事情感到非常困惑:
#include <stdio.h>
int main(){
struct st{
int i,*p;
char c;
union { char type[4]; unsigned char d;} un;
};
struct st s1={25,&a,'X',"asdf"};
printf("sizeof s1 is %d",sizeof(s1));
return 0;
}
由于数据对齐,我认为自大小以来
int i : 4 bytes
int *p : 8 bytes
char c : 1 byte(+3)
union : 4 bytes
输出为20,但输出sizeof s1 is 24
!
为什么输出24?这是否考虑int * p,即8个字节?
答案 0 :(得分:1)
在您的系统上,指针是8个字节并且对齐到8个字节。
1 2 3 4 5 6 7 8 +---+---+---+---+---+---+---+---+ | int i | [pad] | +---+---+---+---+---+---+---+---+ 9 10 11 12 13 14 15 16 +---+---+---+---+---+---+---+---+ | int *p | +---+---+---+---+---+---+---+---+ 17 18 19 20 21 22 23 24 +---+---+---+---+---+---+---+---+ | c | un | [pad] | +---+---+---+---+---+---+---+---+
当然,如果不知道ABI,就无法确定确切的布局。以上只是一个例子。
答案 1 :(得分:0)
在您使用的体系结构上,int *p
为8个字节,但也需要在8字节边界上。这为i
和p
之间提供了4个字节的填充。此外,因为int *p
需要在8字节边界上,所以整体结构需要是8字节的倍数,这样它们的数组总是具有p
的正确对齐。
所以,你最终会得到这样的布局:
i
:4个字节,对齐4 p
:8个字节,对齐8 c
:1个字节un
:4个字节(因为它可以保持字节对齐)