有关内存对齐

有关内存对齐

ID:41963083

大小:205.77 KB

页数:7页

时间:2019-09-05

有关内存对齐_第1页
有关内存对齐_第2页
有关内存对齐_第3页
有关内存对齐_第4页
有关内存对齐_第5页
资源描述:

《有关内存对齐》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、我们知道.按照字节对齐方式的不同.数据结构所片据的存储空间就不同。比如说假如按照四字节对齐struct{chara;shortb;intc;}和struct{chara;intb;shortc;}所占的空间就是不一样的。所以冇时候在程序里存在字节不对齐的时候有可能会出现地址访问错误的问题。请问哪位老大冇这方面的详细资料。或者能给详细讲解一下mipscpu是怎么对内存进行访问的。100分奉上,多谢!!!问题点数:0、冋复次数:8Top1楼NNBWOLF(叫花子)回复于200牛11-2622:40:52得分0关于你的问题,针对i

2、ntelx86简单谈谈:1每次分配内存应该是从4的整数倍地址开始分配,无论是对结构变量还是简单类熨的变量;2对于结构内的int,short等变量必须从偶地址开始分配;3对于结构变量,首先会得到其占用内存最人的成员变量具体占用的空间,然后在结构变量内按照这个量为莫他变量分配空间;4你的第一个结构变量分配的内存空间应该是:struct{chara;BYTE1BYTE2空字节shortb;BYTE3BYTE4intc;BYTE5BYTE6BYTE7BYTES}第二个struct{chara;BYTE1BYTE2BYTE3BYTE4

3、intb;BYTE5BYTE6BYTE7BYTESshortc;BYTE9BYTE10BYTE12Top2楼NNBWOLF(叫花子)回复于2004-11-2622:48:28得分0VO+编译器里面冇个成员结构字节对齐为8字节不要改如果改了,上面的分配方式就会改变.Top3楼omrhal(慷慨的蟹)回复于2004-11-2623:28:50得分0谢谢楼上的,这样的话应该不用考虑字节对齐的问题。但是我现在用的cpu不是intel的,所以内存分配的方式有所不同。当然我可以用pack(1)使具按1字节对齐,但是我想知道具体的寄存器对

4、数据的存取机制是怎样的。Top4楼BMI(小龙)回复于2004-11-2700:11:21得分0[转]什么是内存对齐考虑下面的结构:structtoocharc1;shortS;charc2;inti;};假设这个结构的成员在内存屮是紧凑排列的,假设c1的地址是6那么s的地址就应该是仁c2的地址就是3,i的地址就是4。也就是C100000000,s00000001,c200000003,i00000004。可是,我们在VisualC/C++6中写一个简单的程序:structtooa;printf(Mc1%p,s%p,c2%p

5、,%pM,(unsignedint)(void*)&a.c1-(unsignedint)(void*)&a,(unsignedint)(void*)&a.s・(unsignedint)(void*)&a,(unsignedint)(void*)&a.c2-(unsignedint)(void*)&a,(unsignedint)(void*)&a.i-(unsignedint)(void*)&a);运行,输出:c100000000,s00000002,c200000004,i0000000&为什么会这样?这就是内存对齐而导

6、致的问题。为什么会有内存対齐以下内容节选自《IntelArchitecture32Manual》。字,双字,和四字在自然边界上不需要在内存中对齐。(对字,双字,和四字來说,自然边界分別是偶数地址,可以被4整除的地址,和可以被8整除的地址。)无论如何,为了提高程序的性能,数据结构(尤其是栈)应该尽可能地在自然边界上対齐。原因在于,为了访问未对齐的内存,处理器需耍作两次内存访问;然而,对齐的内存访问仅需耍一次访问。一个字或双字操作数跨越了4字节边界,或者一个四字操作数跨越了8字节边界,被认为是未对齐的,从而需要两次总线周期來访问

7、内存。一个字起始地址是奇数但却没冇跨越字边界被认为是对齐的,能够在一个总线周期中被访问。某些操作双四字的指令需要内存操作数在自然边界上対齐。如果操作数没有対齐,这些指令将会产生一个通川保护异常(#GP)。双四字的口然边界是能够被16整除的地址。其他的操作双四字的指令允许未对齐的访问(不会产生通用保护异常),然而,需要额外的内存总线周期來访问内存中未对齐的数据。编译器对内存对齐的处理缺省情况下,C/C++编译器默认将结构、栈中的成员数据进行内存对齐。因此,上面的程序输出就变成了:C100000000,s00000002,c20

8、0000004,i0000000&编译器将未对齐的成员向后移,将每一个都成员对齐到自然边界上,从而也导致了幣个结构的尺寸变人。尽管会牺牲一点空间(成员Z间有空洞),但提高了性能。也止是这个原因,我们不可以断言sizeof(foo)==8c在这个例子中,sizeof(foo)==12。如何避

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。