支持HW团队,就支付宝领取下面的红包吧!(2018年3月31前,就几毛,也会几块,可以和其他红包叠加使用),你领取消费,HW有奖励。红包使用无条件限制,有条件请注意是不是有病毒。

小伙伴们,给大家发红包喽!人人可领,领完就能用。祝大家领取的红包金额大大大!#吱口令#长按复制此消息,打开支付宝就能领取!er1OEj73Uj

登入 注册 | 验证
| 搜索
HelloWorld论坛 : > 计算机科学、技术、教学> 编程入门> c、c++基础> [转]不同环境下的字节对齐使用
 
 
 
 
类别:c++ 阅读:4109 评论:0 时间:三月 19, 2012, 4:34 a.m. 关键字:

 

 来源:http://blog.csdn.net/maxbiger/archive/2010/01/14/5187646.aspx

GCC 的字节对齐控制

 

GCC 也支持 #pragma 字节控制

l        #pragma pack (n)  gcc 将按照 n 个字节对齐

l        #pragma pack () ,取消自定义字节对齐方式

 

#pragma 只保证的成员相关偏移量是字节对齐的 . 不保证绝对地址对齐 .

 

GCC 也支持某个一个数据结构实现绝对地址的自然对齐

__attribute((aligned (n))) 让所作用的结构成员对齐在 n 字节自然边界上。如果结构中有成员的长度大于 n ,则按照最大成员的长度来对齐。

__attribute__ ((packed)) ,取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

 

struct STRUCT_TEST
 {
  char a;
  int b;
  char c;
 }  __attribute__ ((packed)) ; //
 注意位置 ,  }  ; 之间

l        __attribute  GCC 属性 , #pragma 不同, __attribute__  gcc 的方言 , 只有 GCC 能识别 , 不要在 VC++之类编译器使用这种定义 .

l        __attribute 每次只对一个结构生效 .

 

 

 

ADS 的字节对齐控制

 

ARM 对访问地址有特殊要求 , 如果不对齐 , 会造成程序错误 , 而不是象 X86  PowerPC 那样折成两个指令访问 .因此用 #pragma pack(1) 只是让结构本身成员内部按 1 对齐 , 并不能保证结构的绝对地址是对齐 .

  ADS 采用特殊指令来实现要想保证地址对齐 .ADS 采用 ALIGN.__align(num), .__packed, 来控制字节对齐

l        ALIGN 用于汇编的字节对齐控制

l        __align(num) 类似于 #pragma pack(num), 用于整片代码字节对齐的的控制 .

l        __packed 取消某个结构或成员的内部字节对齐 , 并实现绝对地址对齐 , 类似于 gcc  __attribute__ ((packed));

 

     __packed struct STRUCT_TEST
 {
  char a;
  int b;
  char c;
 }  ;

 

字节对齐练习

请指在 windows 32 下出下列值的 sizeof 和各个成员的偏移量

1. struct  s1{

   short a;

   short b;

   short c;

};

 

2. struct s2{

    char a[21];

    short b;

};

3. struct s2{

    float a;

    char b;

    short c;

    int d;

};

 

5.      #pragma pack (1)

typedef struct s8

{

  char a;

  int b;

  short c;

  double d;

}s8;

#pragma pack ()

[挂载人]初学MPEG [审核人]初学MPEG 推荐

个人签名--------------------------------------------------------------------------------

Please Login (or Sign Up) to leave a comment