typedef struct Student_t
{
int age;
char c;
}__attribute__((aligned (64))) Student;
//影响结构体自身的对齐和大小,每个结构体单独占用64字节 ,不影响其中结构体中元素的对齐
typedef struct Node_t
{
int a;
char c;
} Node __attribute__((aligned(64)));
//只影响Node的对齐, 不影响Node的大小
//对于Node定义的数组,只影响整个数组的起始地址,不影响其中每个数组元素的对齐,每个变量还是占用8个字节,按8字节对齐,总占用内存是64的倍数。
typedef struct Node_p{
int a;
char c;
}__attribute__((packed)) Node_p ;
//影响结构中元素的对齐,通知编译器不做对齐处理等价于 #pragma pack(1)
#pragma pack(push,2)
typedef struct List_t
{
int a;
char c;
}List;
#pragma pack(pop)
//push 和 pop成对出现 ,等价于 #pragma pack(2) 修改结构体中元素对齐规则
typedef int __attribute__((aligned(8))) myint;
// 只影响对齐不影响大小,整个数组按照起始地址8整数倍,数组大小是8的倍数 ,数组元素每个大小还是4
int main()
{
myint MYA[5],mya;
printf("MYA:%p %p %d mya:%p %d\n",&MYA[0],&MYA[4],sizeof(MYA),&mya,sizeof(mya));
Student C[5],c;
printf("C:%p %p %d c:%p %d\n",&C,&C[4],sizeof(C),&c,sizeof(c)) ;
Node_p cc;
printf("***%p %p %d***\n",&(cc.c),&(cc.a),sizeof(Node_p)) ;
Node A[5], a;
printf("A:%p %p %d a:%p %d\n",&A,&A[4],sizeof(A),&a,sizeof(a));
List B[5], b;
printf("B:%p %p %d a:%p %d\n",&B,&B[4],sizeof(B),&b,sizeof(b)) ;
return 0;
}
输出结果
【区别】 pragma作用于结构内的成员变量;attribute ((aligned(n)))作用于结构体分配地址的对齐方式 和 结构体的大小。