__attribute__((aligned())) 和#pragma pack(1)

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)))作用于结构体分配地址的对齐方式 和 结构体的大小。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值