广州seo网站推广费用软件项目管理计划书
web/
2025/10/3 15:47:39/
文章来源:
广州seo网站推广费用,软件项目管理计划书,网络营销包括几个部分,江苏建设培训网站接着前面的文章#xff0c;这篇文章就来说说menory alignment -- 内存对齐. 一、为什么需要内存对齐#xff1f; 无论做什么事情#xff0c;我都习惯性的问自己#xff1a;为什么我要去做这件事情#xff1f; 是啊#xff0c;这可能也是个大家都会去想的问题#xff0c;…接着前面的文章这篇文章就来说说menory alignment -- 内存对齐. 一、为什么需要内存对齐 无论做什么事情我都习惯性的问自己为什么我要去做这件事情 是啊这可能也是个大家都会去想的问题 因为我们都不能稀里糊涂的或者。那为什么需要内存对齐呢这要从cpu的内存访问机制说起. 为了了解清楚cpu的内存访问机制昨天整晚都在查找资料但是还是找不到很好的介绍资料.后来只是找到了相关 的一些介绍的博客。 这些博客中大多都是以介绍内存对齐为主要目的然后顺带着说一下cpu的内存访问机制,所以 找不到权威的资料后来听说汇编语言编程艺术这本书里面有关于x86的系统介绍就下载了一份PDF但是 也还是没有找到. 所以呢下面的一些关于x86的内存访问方面的只是很多都是来源于一些比较好的博客.在文章的最后我会注明参考的 博客链接作为扩展阅读. 简单介绍x86的内存访问机制: 1.内存的写入操作: cpu把需要写入的地址放入地址总线, 把需要写入的数据放入数据总线, 把控制总线置为写入操作. 然后内存子系统根据地址总线选定内存单元, 检查控制总线发现是写入操作,则入去数据总线数据, 写入相关内存 单元. 2.内存的读入操作: cpu把需要读入的地址放入地址总线, 把控制总线置为读入操作. 内存子系统根据地址总线选定内存 单元, 检查控制总线发现是读入操作, 则读取内存单元中的数据, 写入数据总线. 16bit数据总线: 每个内存周期cpu只能读取一个偶单元和一个奇单元地址总线的地址是偶单元的地址所以地址总线的地址永远是2对齐的. 每个内存周期可以读取一个字也就是16bit. 1.读取一个字如果是以2对齐的则只需要一个内存周期即可完成.如果数据不是以2对齐的则需要2个内存周期. 2.读取双字: 如果是以2对齐的则只需要2个内存周期即可完成,如果数据不是以2对齐的则需要3个内存周期完成. 32bit数据总线: 每个内存周期,读取的数据地址都是以4对齐的.一个内存周期可以读取一个双字也就是32bit. 1.如果读取一个双字地址是以4对齐的话则只需要一个内存周期即可完成.如果不是以4对齐,则需要2个内存周期完成. 2.如果读取一个字地址是对4取模余3的话那么需要2个内存周期完成对数据的读取.地址如果对4去模不余3的话则 只需要一个内存周期即可完成数据读取. 3. 对于字节, 任何字节地址读取只需要一个内存周期. 通过上面可以看得出,为什么16bit数据总线cpu是以2对齐的,而32bit数据总线cpu是以4对齐的. 最主要的原因是能够在最小的 内存周期内完成对地址的访问提高cpu的效率. 二、内存对齐的作用 如果不采用内存对齐机制的话有些地址的访问需要在多个内存周期内完成而且还需要多次内存周期读取的高低字节 进行拼凑然后得到32bit数据. 如果使用内存对齐机制不仅可以减少对地址访问过程中需要的内存周期而且还避免了 高低字节的数据拼凑提高了cpu的工作效率. 三、编译器是如何处理内存对齐的 struct mem_alignment
{char a;int b;char c;
};在32位x86机器上面它的大小是12. 另外一个问题如果结构体中的成员变量顺序不一样会导致该结构在内存中的长度 也不一样就像上面如果改成下面这个样子 struct mem_alignment
{char a;char c;int b;
};那么它的大小就变成了8. 如果我们使用紧凑的对齐方式 __attribute__((packed)) or __attribute__((aligned (1)))的话 那么struct mem_alignment的大小应该是6. 或者是使用伪指令#pragma pack (1). #pragma pack (1)struct mem_alignment
{char a;char c;int b;
};#pragma pack () 上面最后一句的作用是恢复编译器默认的对齐方式. 关于内存对齐方面的知识就总结到这里. 也算是对前面文章的交代了~ 参考资料: 从80X86结构看内存对齐问题 http://my.unix-center.net/~Simon_fu/?p262 oschina 内存对齐的问题 http://www.oschina.net/question/234345_48055 Thinking in linux C/C字节对齐详解 http://www.linuxsong.org/2010/09/c-byte-alignment/ 转载于:https://www.cnblogs.com/respawn/archive/2012/07/10/2585334.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/86293.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!