__ATTRIBUTE__ 你知多少?

_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 }

输出结果

原文地址:https://www.cnblogs.com/skullboyer/p/7762097.html