




全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
内存对齐的规则以及作用 Posted on 2009-03-16 09:36 蜗牛先生 阅读(3831) 评论(5) 编辑 收藏 引 用 所属分类: C+ 首先由一个程序引入话题: 1 /环境:vc6 + windows sp2 2 /程序 1 3 #include 4 5 using namespace std; 6 7 struct st1 8 9 char a ; 10 int b ; 11 short c ; 12 ; 13 14 struct st2 15 16 short c ; 17 char a ; 18 int b ; 19 ; 20 21 int main() 22 23 cout“sizeof(st1) is “sizeof(st1)endl; 24 cout“sizeof(st2) is “sizeof(st2)endl; 25 return 0 ; 26 27 程序的输出结果为: sizeof(st1) is 12 sizeof(st2) is 8 问题出来了,这两个一样的结构体,为什么 sizeof 的时候大小不一样呢? 本文的主要目的就是解释明白这一问题。 内存对齐,正是因为内存对齐的影响,导致结果不同。 对于大多数的程序员来说,内存对齐基本上是透明的,这是编译器该干的 活,编译器为程序中的每个数据单元安排在合适的位置上,从而导致了相同的 变量,不同声明顺序的结构体大小的不同。 那么编译器为什么要进行内存对齐呢?程序 1 中结构体按常理来理解 sizeof(st1)和 sizeof(st2)结果都应该是 7,4(int) + 2(short) + 1(char) = 7 。经过内存对齐后,结构体的空间反而增大了。 在解释内存对齐的作用前,先来看下内存对齐的规则: 1、 对于结构的各个成员,第一个成员位于偏移为 0 的位置,以后每个数 据成员的偏移量必须是 min(#pragma pack()指定的数,这个数据成员的 自身长度) 的倍数。 2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对 齐将按照 min(#pragma pack 指定的数值和结构(或联合)最大数据成员 长度),比较小的那个进行。 #pragma pack(n) 表示设置为 n 字节对齐。 VC6 默认 8 字节对齐 以程序 1 为例解释对齐的规则 : St1 :char 占一个字节,起始偏移为 0 ,int 占 4 个字节,min(#pragma pack()指定的数,这个数据成员的自身长度) = 4(VC6 默认 8 字节对齐),所 以 int 按 4 字节对齐,起始偏移必须为 4 的倍数,所以起始偏移为 4,在 char 后编译器会添加 3 个字节的额外字节,不存放任意数据。short 占 2 个字节, 按 2 字节对齐,起始偏移为 8,正好是 2 的倍数,无须添加额外字节。到此规 则 1 的数据成员对齐结束,此时的内存状态为: oxxx|oooo|oo 0123 4567 89 (地址) (x 表示额外添加的字节) 共占 10 个字节。还要继续进行结构本身的对齐,对齐将按照#pragma pack 指 定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,st1 结构 中最大数据成员长度为 int,占 4 字节,而默认的#pragma pack 指定的值为 8,所以结果本身按照 4 字节对齐,结构总大小必须为 4 的倍数,需添加 2 个额 外字节使结构的总大小为 12 。此时的内存状态为: oxxx|oooo|ooxx 0123 4567 89ab (地址) 到此内存对齐结束。St1 占用了 12 个字节而非 7 个字节。 St2 的对齐方法和 st1 相同,读者可自己完成。 内存对齐的主要作用是: 1、 平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任 意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据,否 则抛出硬件异常。 2、 性能原因:经过内存对齐后,CPU 的内存访问速度大大提升。具体原因 稍后解释。 图一: 这是普通程序员心目中的内存印象,由一个个的字节组成,而 CPU 并不是这么 看待的。 图二: CPU 把内存当成是一块一块的,块的大小可以是 2,4,8,16 字节大小,因此 CPU 在读取内存时是一块一块进行读取的。块大小成为 memory access granularity(粒度) 本人把它翻译为“内存读取粒度” 。 假设 CPU 要读取一个 int 型 4 字节大小的数据到寄存器中,分两种情况讨论: 1、数据从 0 字节开始 2、数据从 1 字节开始 再次假设内存读取粒度为 4。 图三: 当该数据是从 0 字节开始时,很 CPU 只需读取内存一次即可把这 4 字节的 数据完全读取到寄存器中。 当该数据是从 1 字节开始时,问题变的有些复杂,此时该 int 型数据不是 位于内存读取边界上,这就是一类内存未对齐的数据。 图四: 此时 CPU 先访问一次内存,读取 03 字节的数据进寄存器,并再次读取 45 字节的数据进寄存器,接着把 0 字节和 6,7,8 字节的数据剔除,最后合并 1,2,3,4 字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外 的操作,大大降低了 CPU 性能。 这还属于乐观情况了,上文提到内存对齐的作用之一为平台的移植原因, 因为以
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 五邑大学《线性代数C》2023-2024学年第二学期期末试卷
- 湛江幼儿师范专科学校《外国电影艺术》2023-2024学年第二学期期末试卷
- 2025至2031年中国工程仿古砖行业投资前景及策略咨询研究报告
- 2025至2031年中国夹锁滑轮行业投资前景及策略咨询研究报告
- 湖北抽风罩施工方案
- 2025至2031年中国五层共挤下吹水冷吹膜机行业投资前景及策略咨询研究报告
- 2025至2030年中国鸡汁豆腐干数据监测研究报告
- 2025至2030年中国铁编制品数据监测研究报告
- 2025至2030年中国自动充气垫数据监测研究报告
- 2025至2030年中国电力专用正弦波逆变电源数据监测研究报告
- 大数据开发工程师招聘面试题与参考回答(某世界500强集团)2025年
- 按摩店技师免责协议书
- 机电设备安装与调试技术课件
- 高三小说复习之叙事技巧省公开课获奖课件市赛课比赛一等奖课件
- 过敏性休克的抢救措施
- 部编人教版小学4四年级《道德与法治》下册全册教案
- 施工现场项目部领导带班制度
- 2024年资格考试-国际焊接工程师(IWE)考试近5年真题附答案
- 科大讯飞财务报表分析报告
- 歌词:半生雪(学生版)
- 2024年高考生物三年高考真题及模拟题分类汇编专题16实验与探究含解析
评论
0/150
提交评论