_ATTRIBUTE__ 你知多少?
1 #include "stdio.h" 2 3 /* 地址参考基准 */ 4 5 char r1; 6 short r2;int refer; 7 8 struct p 9 { 10 int a; 11 12 char b; 13 14 short c; 15 16 }__attribute__((aligned(4))) pp; 17 /* 4字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占2字节(补齐4字节),c本身占2字节 此处占2字节(补齐4字节)*/ 18 19 struct m 20 { 21 char a; 22 23 int b; 24 25 short c; 26 27 }__attribute__((aligned(4))) mm; 28 /* 4字节对齐,a本身占1字节 此处占4字节(补齐4字节),b本身占4字节 此处占4字节,c本身占2字节 此处占4字节(补齐4字节) */ 29 30 struct o 31 { 32 int a; 33 34 char b; 35 36 short c; 37 38 char d; 39 40 }oo; 41 /* 默认字节对齐同4字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占2字节,c本身占2字节 此处占2字节、 42 (b和c一起补齐占4字节,因为b是从4的整数倍地址开始放的),d本身占1字节 此处占4字节(默认字节对齐) */ 43 44 struct x 45 46 { 47 int a; 48 49 char b; 50 51 struct p px; 52 53 short c; 54 55 }__attribute__((aligned(8))) xx; 56 /* 8字节对齐,a本身占4字节 此处占4字节,b本身占1字节 此处占4字节(同a一起补齐8字节因为px是8字节的要从8的整数倍地址放), 57 px本身占8字节 此处占8字节,c本身占2字节 此处占8字节(由于8字节对齐且c是从8的整数倍地址开始放的,所以c要补齐到8字节) */ 58 59 int main() 60 61 { 62 /* 数据类型所占内存大小 */ 63 printf("sizeof(int)=%d, sizeof(short)=%d, sizeof(char)=%d ", sizeof(int), sizeof(short), sizeof(char)); 64 /* 单个变量的地址分配 */ 65 printf("sizeof(refer)=%d, &refer=0x%08X, &r1=0x%08X,&r2=0x%08X ", sizeof(refer), &refer, &r1, &r2); 66 /* 4字节对齐的结构体地址分配 */ 67 printf("pp=%d, &pp=0x%08X, &pp.a=0x%08X, &pp.b=0x%08X, &pp.c=0x%08X ", sizeof(pp), &pp, &pp.a, &pp.b, &pp.c); 68 /* 4字节对齐的结构体地址分配 */ 69 printf("mm=%d, &mm=0x%08X, &mm.a=0x%08X, &mm.b=0x%08X, &mm.c=0x%08X ", sizeof(mm), &mm, &mm.a, &mm.b, &mm.c); 70 /* 默认字节对齐的结构体地址分配 */ 71 printf("oo=%d, &oo=0x%08X, &oo.a=0x%08X, &oo.b=0x%08X, &oo.c=0x%08X, &oo.d=0x%08X ", sizeof(oo), &oo, &oo.a, &oo.b, &oo.c, &oo.d); 72 /* 8字节对齐的结构体地址分配 */ 73 printf("xx=%d, &xx=0x%08X, &xx.a=0x%08X, &xx.b=0x%08X, &xx.px=0x%08X, &xx.c=0x%08X ", sizeof(xx), &xx, &xx.a, &xx.b, &xx.px, &xx.c); 74 75 return 0; 76 77 }
输出结果