struct 自然对齐和#pragma pack

所谓对齐,是指元素存放在内存中的起始地址偏移量(1,2,4,...)。例如,int型数据(size=4),应存放在4的倍数地址的位置上。

数据对齐方便了数据的查询,因为指针的偏移有一定的规律,但是这是以占有更多的内存空间为代价的。

一、struct 自然对齐

  元素对齐:按照元素的size进行

  整体对齐:按照结构体中size最大元素进行

二、#pragma pack(num)

      #pragma pack()   取消对齐  

  元素对齐: 按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。

  整体对齐:   按照结构体中最大的数据成员 和 #pragma pack指定值之间,较小的那个进行。

三、

  1、struct A{

      struct B    对齐以B中最大元素长度为准
    }

  2、gcc 中最大对其单位 是 4;VC编辑器就不是

四、应用实例

  网络编程中传输的数据是结构体时,以往我的做法都是一个元素一个元素的memset,现在可以在定义结构体的时候加上

  #pragma pack(1)

  struct {

  };

  #pragma pack()

  避免结构体的自动对齐,且可以整体memset

五、实例(gcc编译器)

  struct A{

    char a1;
    int a2;
    short a3;
  }; sizeof() = 12  

  

  struct A{

    char a1;
    short a3;

    int a2;

  };sizeof()=8  

  

  struct test{
    char x1;
    short x2;
    double x3;
    char x4;
  };sizeof() = 16

  

  #pragma pack(1)

  struct A{

    char a1;
    int a2;
    short a3;
  }; sizeof() = 7

  

  #pragma pack(2)

  struct A{

    char a1;
    int a2;
    short a3;
  }; sizeof() = 8

转载于:https://www.cnblogs.com/niuniuln/archive/2012/02/07/2341819.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值