首页
论坛
课程
招聘
[求助]内存对齐问题
2011-12-9 17:46 5440

[求助]内存对齐问题

2011-12-9 17:46
5440
书早就买了,刚看到结构体和类那一章,对内存对齐这个概念不是很明白,我想不出编译器为什么要给结构体和类做内存对齐,网上有人说是“性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于,为了访问未对齐的内存,处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问”,大家能不能讲一讲自己的理解啊,还有就是什么是“自然边界”啊,我看了内存对齐的规则,难道依照这种规则对齐后数据结构就放到了自然边界上?

[公告] 欢迎大家踊跃尝试高研班11月试题,挑战自己的极限!

收藏
点赞0
打赏
分享
最新回复 (4)
雪    币: 89
活跃值: 活跃值 (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
swlilike 活跃值 2011-12-9 19:43
2
0
memcopy         直接copy结构体赋值,超方便!  不过  对于不对齐的也可以。。
雪    币: 54
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
GaussAsm 活跃值 2011-12-10 00:44
3
0
呵呵 我试着解答一下 说错勿怪  这个跟地址总线和数据总线有关 大概是在内部只能访问对齐的地址   如果是没对齐的地址  需要读2次数据 比如要取 0x33处的dword  则需要访问0x32 和0x36这2个地址的两个dword  然后调整成0x33处的dword  大概是这个意思 也不知道说错没。。。。具体可以去看 intel微处理器这本书 上面说的很明白 还有后面那个自然边界   意思应该就是 word地址与偶数对其 dword地址与4的倍数对齐
雪    币: 12
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
Navyseal 活跃值 2012-2-17 14:09
4
0
主要是现在的系统都设计成按一定的大小读取数据,你读取“a”和读取“ab”是一样的。因为保存的时候,剩余的部分空间也不保存数据了。比如你定义了。“abc”= 3*8 = 24bit 则存储的假设按32位的存贮还剩。32-24=8个bit。则这个也不保存数据了,直接为0。你想要这个字符串的第一个元素b。则不会只读取b。而是直接把abc0共32个bit直接读取,然后移位操作,得到b。是不是比你算出b的地址简单的多。可以参考一下书的章节是怎么个结构,你看到第二章紧贴着第一章的吗?一般没有。都是在新的一页开始第二章,在目录上第二章是独立的一个页,那个页数和内存地址一个意思。。

硬盘里文件你新建一个TXT文档,就一个字母a,也是512K(这个大小跟你的磁盘格式有关系。FAT16,32,NTFS大小都不一样)大小,你写的内容只要不超过512K的文字都是512大小。你写了513K的文件,则也占用1024K大小。。
雪    币: 34
活跃值: 活跃值 (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
afeny 活跃值 2012-4-20 00:09
5
0
为什么要数据对齐 因为系统是有位宽限制的 不管你在你的函数里面 还是外面声明的 char 或者 byte 当不满祝4字节的时候 会自动补齐4字节  但是你实际使用的过程中只使用了 1字节 剩余的3个字节被丢弃  但是当你使用 命令参数对齐的时候 那么类型是几字节就是几字节 除非你弄数组或指针 另外请注意你在局部声明变量类型不同的时候 esp每次减去的值 是多少 有什么关系你就明白了
游客
登录 | 注册 方可回帖
返回