为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

内存对齐的规则以及作用

2017-09-20 4页 doc 57KB 18阅读

用户头像

is_654168

暂无简介

举报
内存对齐的规则以及作用内存对齐的规则以及作用 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 str...
内存对齐的规则以及作用
内存对齐的规则以及作用 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 "<
示设置为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先访问一次内存,读取0—3字节的数据进寄存器,并再次读取4—5字节的数据进寄存器,接着把0字节和6,7,8字节的数据剔除,最后合并1,2,3,4字节的数据进寄存器。对一个内存未对齐的数据进行了这么多额外的操作,大大降低了CPU性能。     这还属于乐观情况了,上文提到内存对齐的作用之一为平台的移植原因,因为以上操作只有有部分CPU肯干,其他一部分CPU遇到未对齐边界就直接罢工了。   图片来自:Data alignment: Straighten up and fly right 如大家对内存对齐对性能的具体影响情况,可以参考上文。
/
本文档为【内存对齐的规则以及作用】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索