c 中内存对齐问题详解

在c中内存对齐和cpu 有关,下面我们以32为处理器为例来详解:


#pragma pack()

      这是一个特别的宏 他可以动态的改变对齐基数;

      c 中数组无论是自对其还是数组对齐 都是已pack 宏和他的最大成员变量 的最小值 为对齐参数。


数组对齐原则:

        1. 成员是变量 按照自身和pack 最小的值(对齐基数)对齐,及他的开始地址为对齐基数的整数倍。

         2. 如果成员变量中含有 结构体或联合体,对齐基数为他的成员中最大值和pack两者中的最小为对齐基数。 他的开始地址必须为这个值得正数倍。

         3. 数组自对齐 数组成员中最大值和pack两者中最小值为对齐基数 他的大小必须为对齐基数的整数被



eg:


      typedef struct  test   

      {

             int a;                    // 自对齐基数 4

             char b;               //自对其基数 1 

             int c;                  // 自对其基数 4

      } test_1;                  //   数组自对其基数 4


     typedef struct test_b

     {

          int aa;                   // 自对齐基数4 

          char bb;              //  自对齐基数 1  

          test_1 cc;           //  自对齐基数 4 (党成员为数组时 对齐基数为 他的机构体中最大的成员对齐基数)

          char dd;            //  自对其基数 1 

    }test_2;                  //  数组自对其基数 4 (成员中最大的和pack中最小的那个)


   printf("---------->> the test_1 len is =%d\n",sizeof(test_1));

   printf("---------->> the test_2 len is =%d\n",sizeof(test_2));


  输出为: 12  , 24

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值