为什么要内存对齐?

mountaineer 2003-07-07 05:39:20
加精
想知道why? 有什莫好处,如何作。
多谢啦
...全文
3487 202 打赏 收藏 举报
写回复
202 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
w803007 2003-11-14
收藏!
  • 打赏
  • 举报
回复
大健 2003-07-21
学习
  • 打赏
  • 举报
回复
Wenxy1 2003-07-21
楼上满天星星。
^0^
  • 打赏
  • 举报
回复
reddatura 2003-07-21
真强,什么时候我也能来这里“吵架“就好了!
  • 打赏
  • 举报
回复
swimmer2000 2003-07-21
看本接口技术的书,里面讲了cpu怎么取数的,数由两字节组成,奇地址和偶地址,如果从奇地址开始要两个周期,若从基地址开始,只要一个周期。这和cpu的工作方式有关。
  • 打赏
  • 举报
回复
happycock 2003-07-21
给楼上的一句话,你不发言,永远也到不了五星
  • 打赏
  • 举报
回复
frankzch 2003-07-21
超人气呕像巨星全阵容,偶也来看看
什么时候有5颗红星了,就来发表意见
现在是学习
  • 打赏
  • 举报
回复
1998810 2003-07-21
<inside c++ object model>里好象有解释
  • 打赏
  • 举报
回复
wujianfeng 2003-07-20
我想也是
  • 打赏
  • 举报
回复
hswxf 2003-07-20
我认为这个问题是可以从二个方面理解:
1、硬件结构决定了软件的性质,在硬件设计上是一个基于8位的数据线来定义微程序的。这样的软件设计只能是基于8位的,指令的形成也是这样的,是一个基于8位的理解来完成对程序的认识;在存储器的设计中为了上述的理由分为偶存储体与奇存储体各是8位,每次针对内存的存取数据均以二次取出(16位),这是硬件上的规定或说是设计上确定的。
2、如果只从高层来理解,只能是一种“产生正确”的答案的方法是什么的讨论,这一点上楼上英雄说的精彩。
贴主的这个问题应该是一个软对硬的要求,从硬来解答软的原因
  • 打赏
  • 举报
回复
bearfly1980 2003-07-20
找本关于计算机结构的看看就知道了!!!!
计算机中内存是按照bank来组织的,比如说:bank1对应第一个byte,bank2对应第二个byte,一般来说访问内存时,需要cpu产生一个选通信号,如果是按照bank来读写的话,一个地址选通信号可以同时选通两个bank,从而读出bank1,bank2的数据,这样对齐的话就可以在一个读写周期里读出两个byte,而如果没有对齐,要读出两个byte则要两个读写周期!!!
  • 打赏
  • 举报
回复 1
maojunhua 2003-07-20
应该是效率,看Andrew S.Tanenbaum (Minix开发者)的《结构化计算机组成》或者John L. Hennessy(Mips提出者)和David A. Patterson(Risc提出者)《计算机体系结构:一种量化的研究方法》。我觉得从体系结构理解比较好,讨论在软件层的影响又是另外一回事了,前为因后为果,不能把影响说成原因
  • 打赏
  • 举报
回复
minghui000 2003-07-20
Regardless of the state of the $A directive, variables and typed constants are always aligned for optimal access. In the {$A+} state, execution will be faster.
  • 打赏
  • 举报
回复
1cs1ak1 2003-07-19



up



  • 打赏
  • 举报
回复
ckacka 2003-07-19
glassshark()和internet(bbc)是同一个人
  • 打赏
  • 举报
回复
cherry0805 2003-07-19
我也是,象牛人学习一下
  • 打赏
  • 举报
回复
pressman 2003-07-19
学习,
我是刚刚来的菜鸟!
  • 打赏
  • 举报
回复
Jupin 2003-07-19
(摘自MSDN)
应用程序通常在地址中对齐结构成员,而这些地址对所涉及的数据类型和处理器是“自然的”。例如,一个 4 字节数据成员的地址应该是 4 的倍数。

当编写用于移植到多处理器的代码时,此原则特别重要。没有对齐的 4 字节数据成员所在的地址不是 4 的倍数,这将导致 80386 处理器的性能损失和 MIPS® RISC 处理器的硬件异常。后一种情况中,虽然系统会处理异常,但是性能损失更明显。

下面的原则确保 Win32 处理器的正确对齐:

类型 对齐方式
char 与字节边界对齐
short(16 位) 与偶数字节边界对齐
int 和 long(32 位) 与 32 位边界对齐
float 与 32 位边界对齐
double 与 64 位边界对齐
structures 任何成员的最大对齐要求
unions 第一个成员的对齐要求

编译器自动根据这些要求对齐数据,在结构中插入空白,直至 /Zp 选项或 #pragma pack 指定的限制(默认包大小)。例如,/Zp2 允许最多 1 字节的空白,/Zp4 允许最多 3 字节的空白,诸如此类。Windows 3.x 的默认包大小为 2,而 Win32 的默认包大小为 8。因此:

如果用 /Zp 或 #pragma pack 指定了封装限制,则不能获得正确的 Win32 对齐(默认值)。
不同的 Win32 默认设置会改变某些结构成员的偏移量,从而影响源代码。仔细检查代码,确认是否已经硬编码这些偏移量,或者代码是否根据特定的默认包大小进行假设。
  • 打赏
  • 举报
回复
giantzz 2003-07-19
为什么要急着结贴,再等等,汇编版的牛人还没到齐!
放心,保证给您一个满意的答案!



  • 打赏
  • 举报
回复
internet 2003-07-19
来了许多带"星"的,我好怕呢.
嗯,晚上睡不着,要作恶梦了.(坏了,又写错了一个字).
  • 打赏
  • 举报
回复
加载更多回复(182)
发帖
C语言

6.6w+

社区成员

C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
帖子事件
创建了帖子
2003-07-07 05:39
社区公告
暂无公告