首页 考试吧论坛 Exam8视线 考试商城 网络课程 模拟考试 考友录 实用文档 求职招聘 论文下载
2011中考 | 2011高考 | 2012考研 | 考研培训 | 在职研 | 自学考试 | 成人高考 | 法律硕士 | MBA考试
MPA考试 | 中科院
四六级 | 职称英语 | 商务英语 | 公共英语 | 托福 | 雅思 | 专四专八 | 口译笔译 | 博思 | GRE GMAT
新概念英语 | 成人英语三级 | 申硕英语 | 攻硕英语 | 职称日语 | 日语学习 | 法语 | 德语 | 韩语
计算机等级考试 | 软件水平考试 | 职称计算机 | 微软认证 | 思科认证 | Oracle认证 | Linux认证
华为认证 | Java认证
公务员 | 报关员 | 银行从业资格 | 证券从业资格 | 期货从业资格 | 司法考试 | 法律顾问 | 导游资格
报检员 | 教师资格 | 社会工作者 | 外销员 | 国际商务师 | 跟单员 | 单证员 | 物流师 | 价格鉴证师
人力资源 | 管理咨询师考试 | 秘书资格 | 心理咨询师考试 | 出版专业资格 | 广告师职业水平
驾驶员 | 网络编辑
卫生资格 | 执业医师 | 执业药师 | 执业护士
会计从业资格考试会计证) | 经济师 | 会计职称 | 注册会计师 | 审计师 | 注册税务师
注册资产评估师 | 高级会计师 | ACCA | 统计师 | 精算师 | 理财规划师 | 国际内审师
一级建造师 | 二级建造师 | 造价工程师 | 造价员 | 咨询工程师 | 监理工程师 | 安全工程师
质量工程师 | 物业管理师 | 招标师 | 结构工程师 | 建筑师 | 房地产估价师 | 土地估价师 | 岩土师
设备监理师 | 房地产经纪人 | 投资项目管理师 | 土地登记代理人 | 环境影响评价师 | 环保工程师
城市规划师 | 公路监理师 | 公路造价师 | 安全评价师 | 电气工程师 | 注册测绘师 | 注册计量师
缤纷校园 | 实用文档 | 英语学习 | 作文大全 | 求职招聘 | 论文下载 | 访谈 | 游戏
您现在的位置: 考试吧(Exam8.com) > 计算机等级考试 > 计算机二级 > C语言 > 复习资料 > 正文

二级C语言:typedefPACKEDstruct字节对齐详解

来源:考试吧Exam8.com) 2010-3-14 16:34:55 考试吧:中国教育培训第一门户 模拟考场
本文为“计算机二级C语言:typedefPACKEDstruct字节对齐详解”,更多有关计算机等级考试三级信息管理资料,请访问考试吧计算机等级考试频道。

  六.字节对齐可能带来的隐患:

  代码中关于对齐的隐患,很多是隐式的。比如在强制类型转换的时候。例如:

  unsigned int i = 0x12345678;

  unsigned char *p=NULL;

  unsigned short *p1=NULL;

  p=&i;

  *p=0x00;

  p1=(unsigned short *)(p+1);

  *p1=0x0000;

  最后两句代码,从奇数边界去访问unsignedshort型变量,显然不符合对齐的规定。

  在x86上,类似的操作只会影响效率,但是在MIPS或者sparc上,可能就是一个error,因为它们要求必须字节对齐.

  七.如何查找与字节对齐方面的问题:

  如果出现对齐或者赋值问题首先查看

  1. 编译器的big little端设置

  2. 看这种体系本身是否支持非对齐访问

  3. 如果支持看设置了对齐与否,如果没有则看访问时需要加某些特殊的修饰来标志其特殊访问操作。

  arm下的对齐处理

  from DUI0067D_ADS1_2_CompLib

  3.13 type   qulifiers

  有部分摘自arm编译器文档对齐部分

  对齐的使用:

  1.__align(num)

  这个用于修改最高级别对象的字节边界。在汇编中使用LDRD或者STRD时

  就要用到此命令__align(8)进行修饰限制。来保证数据对象是相应对齐。

  这个修饰对象的命令最大是8个字节限制,可以让2字节的对象进行4字节

  对齐,但是不能让4字节的对象2字节对齐。

  __align是存储类修改,他只修饰最高级类型对象不能用于结构或者函数对象。

  2.__packed

  __packed是进行一字节对齐

  1.不能对packed的对象进行对齐

  2.所有对象的读写访问都进行非对齐访问

  3.float及包含float的结构联合及未用__packed的对象将不能字节对齐

  4.__packed对局部整形变课抻跋?BR>   5.强制由unpacked对象向packed对象转化是未定义,整形指针可以合法定

  义为packed。

  __packed int* p;   //__packed int 则没有意义

  6.对齐或非对齐读写访问带来问题

  __packed struct STRUCT_TEST

  {

  char a;

  int b;

  char c;

  }   ;     //定义如下结构此时b的起始地址一定是不对齐的

  //在栈中访问b可能有问题,因为栈上数据肯定是对齐访问[from CL]

  //将下面变量定义成全局静态不在栈上

  static char* p;

  static struct STRUCT_TEST a;

  void Main()

  {

  __packed int* q;   //此时定义成__packed来修饰当前q指向为非对齐的数据地址下面的访问则可以

  p = (char*)&a;

  q = (int*)(p+1);

  *q = 0x87654321;

  /*

  得到赋值的汇编指令很清楚

  ldr       r5,0x20001590 ; = #0x12345678

  [0xe1a00005]    mov       r0,r5

  [0xeb0000b0]    bl        __rt_uwrite4   //在此处调用一个写4byte的操作函数

  [0xe5c10000]    strb      r0,[r1,#0]    //函数进行4次strb操作然后返回保证了数据正确的访问

  [0xe1a02420]    mov       r2,r0,lsr #8

  [0xe5c12001]    strb      r2,[r1,#1]

  [0xe1a02820]    mov       r2,r0,lsr #16

  [0xe5c12002]    strb      r2,[r1,#2]

  [0xe1a02c20]    mov       r2,r0,lsr #24

  [0xe5c12003]    strb      r2,[r1,#3]

  [0xe1a0f00e]    mov       pc,r14

  */

  /*

  如果q没有加__packed修饰则汇编出来指令是这样直接会导致奇地址处访问失败

  [0xe59f2018]    ldr       r2,0x20001594 ; = #0x87654321

  [0xe5812000]    str       r2,[r1,#0]

  */

  //这样可以很清楚的看到非对齐访问是如何产生错误的

  //以及如何消除非对齐访问带来问题

  //也可以看到非对齐访问和对齐访问的指令差异导致效率问题

  }

上一页  1 2 3 4  下一页
  相关推荐:计算机等考二级C:C中如何显示*.bmp文件
       计算机等考二级:关于C语言中无符号数和有符号数
       C语言中标准输入流、标准输出流、标准错误输出流
文章搜索
版权声明:如果计算机等级考试网所转载内容不慎侵犯了您的权益,请与我们联系800@exam8.com,我们将会及时处理。如转载本计算机等级考试网内容,请注明出处。