| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1235 人关注过本帖
标题:大家帮忙看看内存对齐问题!
只看楼主 加入收藏
divingmaomao
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-8-9
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:16 
大家帮忙看看内存对齐问题!
“一个字或双字操作数跨越了4 字节边界,或者一个四字操作数跨越了8 字节边界,被
认为是未对齐的,从而需要两次总线周期来访问内存”。


不太理解“双字操作数跨越了4 字节边界” 和 “四字操作数跨越了8 字节边界”,大家帮忙解释解释.

谢谢!

[ 本帖最后由 divingmaomao 于 2010-8-10 09:24 编辑 ]
搜索更多相关主题的帖子: 内存 
2010-08-09 17:03
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:5 
字,也就是WORD,这个类型在16位windows编程的时代被定义为16位整数类型。
尽管如今的系统环境下,机器字的长度是32位甚至64位,但是您的问题里面那句话是引用16位时代的文献的。
也就是说,您的上下文里面,双字就是指32位变量,四字就是指64位变量。

32位变量的首地址如果是4n,那么它实际占用4n,4n+1,4n+2,4n+3四个地址,这叫做内存对齐。
反之,如果32位变量的首地址不是4n型,
例如4n+1,那么它就得占用4n+1,4n+2,4n+3,4(n+1)四个地址,这个就叫“跨越4字节边界”,内存没有对齐。
同理,一个64位变量如果占用8n到8n+7的地址,那就是没有跨越边界,内存对齐了;否则就是跨越8字节边界,不对齐。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-08-09 18:09
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
我觉得已经解释的很清楚了~
2010-08-10 01:56
divingmaomao
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-8-9
收藏
得分:0 
谢谢!

一直以32位理解,现在整个串起来还是有些地方不能想通,能串起来讲解下吗?

一次总线周期访问(32位下  char、int、long、longlong)如何寻址?————>内存对齐后如何寻址?————>为什么说(32位下  char、int、long、longlong)内存对齐后一次总线周期就能访问?

麻烦高手们解惑?

谢谢!
2010-08-10 09:22
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
它只能寻址对齐的,所以对齐了一下就找到了。对不齐的,只能寻址两次,一次读一半,然后在拼起来。
比如下面,+号的地方是应该对齐的位置。
程序代码:
+---+---+---+---
1234
+---+---+---+---
**1234**

如果是第一种情况,一次就能读出1234
第二种,第一次读第一个格扔掉前两位,第二次读第二个格扔掉后两位,拼成1234。
2010-08-10 09:40
divingmaomao
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-8-9
收藏
得分:0 
都约定好的吗?

如果是读取char类型: 无论在什么位置(不管是否对齐)一次总线周期访问都能读取到(丢弃无效位吗?);

如果是读取short类型:就约定从2个字节对齐的地址开始访问,一次总线周期(32位)读取2个字节;

如果是读取int类型:就约定从4个字节对齐的地址开始访问,一次总线周期(32位)读取4个字节;

那如果是读取64位数据怎么办?

这样理解对吗?
2010-08-10 10:47
forever74
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:CC
等 级:版主
威 望:58
帖 子:1705
专家分:4345
注 册:2007-12-27
收藏
得分:0 
如果数据总线是32位的,那么对于8字节内存对齐来说,它的作用无非是保证两周期读取数据而不拖延到三个周期。

BTW:
(1)对于某些系统,你可以要求它不进行内存对齐检查。
(2)对于某些物理内存,比如DDR,每个实际的总线周期可以处理数据超过1次,这个不在本次讨论范围。

对宇宙最严谨的描述应该就是宇宙其实是不严谨的
2010-08-10 10:56
divingmaomao
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-8-9
收藏
得分:0 
对于char类型:无论在奇数边界还是在偶数边界,32位寻址从偶地址开始,是因为每次读取32位都能读取到吗?

还请高手们指出不对的地方,详细解释下内存对齐的缘由!!!

不胜感激!
2010-08-10 11:13
死了都要C
Rank: 4
来 自:四川成都
等 级:贵宾
威 望:13
帖 子:1582
专家分:116
注 册:2006-12-7
收藏
得分:0 
这个是哪方面的知识啊。。汇编?

女施主``我给你``送茶来了```师太``你就从了老衲吧``
代码本天成~~~妙头偶得之```
2010-08-10 12:23
divingmaomao
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2010-8-9
收藏
得分:0 
查了计算机系统结构,找到相关解释:存储器宽度32位,一个存储周期可以访问4个字节,按照这个思想去理解,跨越边界的问题也能想通的了,这边可以贴图就好了!


图片附件: 游客没有浏览图片的权限,请 登录注册
2010-08-10 15:19
快速回复:大家帮忙看看内存对齐问题!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018125 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved