zoukankan      html  css  js  c++  java
  • 结构体字节对齐2

      为了使CPU访问数据更加高效,编译器在编译程序时会自动进行对齐操作(GCC默认4字节对齐,windows VC默认8字节对齐),所谓对齐即让数据的首地址是数据长度的整数倍,如int 的长度是4 ,则其首地址应该能被4整除。

      在程序编写的时候,若要强制数据结构对齐,有两种方式,一种方式是使用#pragma pack(n)规定对齐的大小,然后再用#pragma pack()恢复默认编译器字节对齐;一种方式是使用__attribute__((aligned(n))),但两者之间存在一定的区别。

      关于结构体字节对齐的详细介绍请读者到http://www.cnblogs.com/dolphin0520/archive/2011/09/17/2179466.html阅读。本文只在这里做两种自定义对齐的区别分析。

    #pragma pack(n)

    首先上代码

    #include <stdio.h>
    #pragma pack(4) //设置4字节对齐
    struct test_struc{
       char a;
       short b;
       char c;
    };
    #pragma pack() //恢复编译器默认对齐
    int main(void){
       printf("size of test_struc:%d
    ", sizeof(struct test_struc));
    }

    运行结果

    # ./test
    size of test_struc:6

     结果分析:

     结构体test_struc中最长元素占长度为sizeof(short)=2 字节,

    而#pragma pack(4)设置的4字节对齐,两者取较小者,所以结构体按2字节对齐,
    char a ------------2字节
    short b -----------2字节
    char c ------------2字节

    __attribute__((aligned(n)))

    上代码

    #include <stdio.h>
    struct test_struc{
       char a;
       short b;
       char c;
    }__attribute__((aligned(4)));
    int main(void){
       printf("size of test_struc:%d
    ", sizeof(struct test_struc));
    }

    运行结果:

    #./test
    size of test_struc:8

     结果分析:

     __attribute__((aligned(4)))是强制4字节对齐,不管结构体本身元素的最大大小是多少,结构体总体大小必须是 4的整数倍

    char a --------------2字节

    short b -------------2字节

    char c ---------------4字节

  • 相关阅读:
    混音
    Utrack声卡和机架包的调试
    音源推荐
    Silverlight & Blend动画设计系列四:倾斜动画(SkewTransform)
    Silverlight & Blend动画设计系列三:缩放动画(ScaleTransform)
    Silverlight & Blend动画设计系列二:旋转动画(RotateTransform)
    Silverlight & Blend动画设计系列一:偏移动画(TranslateTransform)
    创建WPF用户控件
    修改K3数据是简介方法
    周六周日为休息日的工厂日历修改变成工作日
  • 原文地址:https://www.cnblogs.com/kekukele/p/3663020.html
Copyright © 2011-2022 走看看