关于pragma pack,__attribute__(packed)

转自https://blog.csdn.net/zhangxiong2532/article/details/50826917
程序编译器对结构的存储的特殊处理确实提高CPU存储变量的速度,但是有时候也带来了一些麻烦,我们也屏 蔽掉变量默认的对齐方式,自己可以设定变量的对齐方式。例如我们设置结构体的对齐方式:

struct student
{
    int age;
    char c;
};

对于以上结构体,默认用sizeof输出大小为8字节,默认的字节对齐方式是4,当然我们也可以设置他的对齐 方式,如下:

#pragma pack(2) //(或 pragma(push,4))
struct student
{
    int age,
    char c;
};
#pragma pack(pop) //注意这个和push是成对用的

此时用sizeof输出大小是为6,因为对齐方式为2.如果设置对齐方式为1的话,sizeof输出大小则为5;当然有时我们不希望编译器对结构体做对齐处理,而希望按照他原有的大小分配空间,这里就要用到__attribute__((packed)) ,这个意思是告诉编译器不要做对齐处理。

struct Student
{
    int age;
    char c;
}__attribute__((packed));
int main()
{
    struct Student S;
    printf("%d\n",sizeof(S));
    return 0;
}

输出大小为 5,其实和一字节对齐方式一样。
到这里可能许多人和我刚开始一样不理解这个__attribute__((packed)) 是个什么东东,这个其实是GUN C 的一大特色,是一种机制,他可以设置函数属性,变量属性,类型属性,packed就是个类型属性.当然__attribute__((packed))还可以用来设置字节对齐属性__attribute__((packed));设置4字节对齐方式,和#pragma pack(4) 效果一样,我的总结大概就是这些.

#include <stdio.h>
typedef struct Student_t
{
    int age;
    char c;
}__attribute__((packed)) Student;

typedef struct Node_t
{
    int a;
    char c;
}__attribute__((aligned(4))) Node;

#pragma pack(push,1)
typedef struct List_t
{
    int a;
    char c;
}List;
#pragma pack(pop)

int main()
{
    Node A;
    List B;
    Student C;
    printf("%d,%d,%d\n",sizeof(A),sizeof(B),sizeof(C));
    return 0;
}

输出大小依次为:5,8,5

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值