结构体数据对齐方法的研究

来源 :未来英才 | 被引量 : 0次 | 上传用户:tengyao2009
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:内存地址对齐,是一种在计算机内存中排列数据、访问数据的一种方式。当今的计算机在计算机内存中读写数据时都是按字(word)大小块来进行操作的。基本类型数据对齐就是数据在内存中的偏移地址必须等于一个字(word)的倍数,按这种存储数据的方式,可以提升系统在读取数据时的性能。有时候为了对齐数据,可能必须在上一个数据结束和下一个数据开始的地方插入一些没有用处字节,这就是结构体数据对齐。
  关键词:结构;数据
  一、假设计算机的字大小为4个字节,因此变量在内存中的首地址都是满足4地址对齐,CPU只能对4的倍数的地址进行读取,而每次能读取4个字节大小的数据
  假设有一个整型的数据a的首地址不是4的倍数,因此想读取a的数据,CPU要进行两次内存读取,而且还要对两次读取的数据进行处理才能得到a的数据,而一个程序的瓶颈往往不是CPU的速度,而是取決于内存的带宽,因为CPU得处理速度要远大于从内存中读取数据的速度,因此减少对内存空间的访问是提高程序性能的关键[1]。从上例可以看出,采取内存地址对齐策略是提高程序性能的关键。
  二、结构体默认的规则
  本文所述的环境均是在32位编译器的编译环境中,一般编译器默认对齐方式是4字节。
  总结结构体的数据对齐方式满足条件:
  1、结构体变量的首地址能够被其最宽基本类型成员的大小所整除。2、结构体每个成员相对于结构体首地址的偏移量(offset)都是成员自身大小的整数倍,如有需要编译器会在成员之间加上填充字节。3、结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
  三、手动对齐方式
  如果编译器自动实现结构体对齐,我们就称为自动对齐,与之相反,使用#pragma进行对齐的就是手动对齐。
  #pragma备用告诉编译器,程序员自己希望的对齐方式。比如,虽然编译器的默认对齐方式是4,但是如果我們不希望按照4对齐,而是希望是8,这个时候就必须使用#pragma进行手动对齐了。
  常用的设置手动对齐的命令有两种:第一种是#pragmapack(),这种就是设置编译器1字节对齐,不过也可以认为是设置为不对齐或者取消对齐;第二种是
  #pragmapack(4),这个括号中的数字表示希望以多少字节进行对齐。
  我们需要#prgamapack(n)开头,以#pragmapack()结尾,定义一个区间,这个区间内的对齐参数就是n。
  举例说明
  (一)自动对齐方式或者是默认4字节对齐
  分析代码:根据基本数据类型对齐规则可知,c(字节),i(4字节),d(8字节),b(2字节)。是不是结果就是1+4+8+2呢?很明显不是,c是首元素,不需要对齐,但是后面的就需要对齐了,i是4字节,但是它的起始偏移量只有1字节,不能整除4,因此就在c后面再加3个字节,当遇到d时,由于之前的偏移量就是8,所以不需要偏移,在b之前有16字节,这时也不需要偏移就是直接加上2。所以最后结果就是1+3+4+8+2=20,对不对呢?其实是不对的,因为18不是默认对齐4的整数倍,还需要在后面补充2字节。一共就是20字节。
  分析:该结果就是24字节,分析同上,但是在最后一步不一样,对齐是8字节,所以在b后面还需要添加6字节。最终结果就是24.
  四、结语
  需要字节对齐的根本原因在于CPU访问数据的效率问题。因为计算机可以处理数据位数都是确定的,这时候就说明它一次性只能处理确定位数的数据,但是当认为造成该数据不在计算机一次性可访问的范围内的时候,计算机就会按照一定的优化方法来处理,这样是更加方便和快捷的处理数据。也就是强制的要求一来简化了处理器与内存之间传输系统的设计,二来可以提升读取数据的速度。
  参考文献
  [1] 陈荣,蔡志勇,胡保安. 基于嵌入式操作系统VxWorks数据采集系统软件设计[J]. 科技广场,2005,(06):82-84.
其他文献
F5 Networkst 查询号182F5 Networks公司作为互联网流量和内容管理(iTCM)产品提供商,近日宣布推出其互联网控制体系结构(Internet Control Architecture),旨在通过通用接口提供对
2020年,巴中市通江县就业局积极应对疫情影响,把就业工作摆在更加突出的位置,不断强化工作组织保障,落实稳岗就业措施,加大职业培训力度,努力扩大就业规模,扎实做好稳就业工
期刊
“九五”时期需要提高农业投资比重农业部综合计划司施贵凌1996年元月上旬结束的中央农村工作会议,再一次把发展农业提到国民经济最重要的战略地位,明确把农业放在国民经济的首位。
桂林地处桂北暴雨中心,全年降雨充沛,年降雨量达2000mm,但时空分布不均,汛期暴雨频,非汛期降雨稀少,河流干涸;境内河流密布,分属长江洞庭湖水系和珠江水系,是生活和生产的主要供水水
会议
随着食用菌技术的普及,各地原材料十分紧缺,特别是麸皮(米糠)不仅价格高,且难买到。为此我们选用了桑蚕副产物的蚕粪代麸皮(米糠)制作菌种。取得了较满意的效果,现简单介绍
加强水资源管理是贯彻落实科学发展观,实行最严格的水资源管理制度,推动经济社会发展与水资源承载能力、水环境承载能力相协调,是增强可持续发展能力的迫切需要。实行最严格的水
会议
2020年,在成都市人社局、简阳市人社局、简阳市教育局的指导下,四川空分集团技工学校全体师生奋力拼搏,顺利完成了年度各项工作任务.rn学校加强思想政治教育工作,不断凝聚学
期刊
为准确掌握流域区内水土流失产生、发展的变化规律,为政府部门实施控制流域水土流失、水土保持提供科学依据,对南流江流域进行泥沙输送动态监测是一项非常重要工作。既然降雨、
岁末年终,农民工欠薪问题进入易发、多发期,雅安市人社局把农民工的根本利益放在心上、抓在手上,以党建引领,充分发挥党组织战斗堡垒作用,实施“懂政策、知民情、解难题、守
期刊
四川省服装艺术学校是一所公办综合性中等专业学校,省属国家级重点职校、全国职业教育先进单位、首批省级双示范校建设学校.学校前身为张澜在1913年创办的南充县立中学,是四
期刊