不同环境下的字节对齐使用

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 ()

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值