gcc结构体对齐

struct  A a =        //gcc支持的一种结构体赋值方式,好处是可以单独赋值
{                     //结构体变量对齐存放,所以a的大小为8字节
    .a = 4 ,
    .b = 555 ,
}

// 定义类型的同时定义变量,s1是一个变量。
struct  student
{
     char  name[ 20 ];
     int  age;
}s1;

// 将类型struct student重命名为s1,s1是一个类型名,不是变量
typedef   struct  student
{
     char  name[ 20 ];
     int  age;
}s1;

s.a  =   12 ;         // 编译器在内部还是转成指针式访问 int *p = s; *(p+0) = 12;
s.b  =   44 ;         // int *p = s; *(p+1) = 44;
s.c  =   64 ;         // int *p = s; *(p+2) = 44;

s1.a  =   12 ;         // int *p = (int *)&s1; *p = 12;
s1.b  =   4 . 4 ;         // double *p = (double *)(&s1 + 4); *p = 4.4;
s1.c  =   'a' ;         // char *p = (char *)((int)&s1 + 12); *p = 'a';

struct  stu
{                             // 1字节对齐    4字节对齐
     char  sex;                 // 1            4(1+3)
     int  length;                 // 4            4
     char  name[ 10 ];             // 10            12(10+2)
};

---gcc支持但不推荐的对齐指令:# pragma  pack()   # pragma  pack(n) (n = 1 / 2 / 4 / 8 )
( 1 )# pragma 是用来指挥编译器,或者说设置编译器的对齐方式的。编译器的默认对齐方式是 4 ,但是有时候我不希望对齐方式是 4 ,而希望是别的(譬如希望 1 字节对齐,也可能希望是 8 ,甚至可能希望 128 字节对齐)。
( 2 )常用的设置编译器编译器对齐命令有 2 种:第一种是# pragma  pack(),这种就是设置编译器 1 字节对齐(有些人喜欢讲:设置编译器不对齐访问,还有些讲:取消编译器对齐访问);第二种是# pragma  pack( 4 ),这个括号中的数字就表示我们希望多少字节对齐。
( 3 )我们需要#prgama pack(n)开头,以# pragma  pack()结尾,定义一个区间,这个区间内的对齐参数就是n。
( 4 )#prgma pack的方式在很多C环境下都是支持的,但是gcc虽然也可以不过不建议使用。

---gcc推荐的对齐指令__attribute__((packed))  __attribute__((aligned(n)))
( 1 )__attribute__((packed))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。packed的作用就是取消对齐访问。
( 2 )__attribute__((aligned(n)))使用时直接放在要进行内存对齐的类型定义的后面,然后它起作用的范围只有加了这个东西的这一个类型。它的作用是让整个结构体变量整体进行n字节对齐(注意是结构体变量整体n字节对齐,而不是结构体内各元素也要n字节对齐)

---参考阅读blog:
    http : //www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html
    http : //blog.csdn.net/sno_guo/article/details/8042332
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值