32位编译器4个字节,64位编译器8个字节;
struct T{
char a; //1
int *d; //4
int b; //4
int c:16; //2 c:16表示16位2个字节
double e; //8
};T *p;
32 位(4+4+4+4+8)
char a 1个字节,为了满足字节对齐还需填充3个字节(填充的3个字节浪费,编译器字节对齐浪费也没办法);[0] - - - 4
int *d 4个字节,正好满足字节对齐; [4] [5] [6] [7] 4
int b 4个字节,正好满足字节对齐; [8] [9] [10] [11] 4
int c:16 2个字节,为了满足字节对齐还需填充2个字节;[12] [13] - - 4
double e 8个字节(两个4四个字节),满足字节对齐; [16] [17] [18] [19]
[20] [21] [22] [23]
64位(8+8+8+8)
char a 1个字节,为了满足字节对齐还需填充7个字节;[0] - - - - - - - 8
int *d 4个字节,为了满足字节对齐还需填充4个字节; [8] [9] [10] [11] - - - - 8
int b 4个字节,为了满足字节对齐还需填充4个字节;[16] [17] [18] [19] - - - -
int c:16 2个字节,因为只占2个字节,而上一个字节对齐中还有4个空的,所以这两个合并后还要补充2个字节 [16] [17] [18] [19] [20] [21] - - 8
double e 8个字节,满足字节对齐;[24] [25] [26] [27] [28] [29] [30] [31] 8
这就是为什么4个8而不是5个8 的原因;