【问题标题】:Memory alignment of larger-than-one-address integral types大于一个地址整数类型的内存对齐
【发布时间】:2012-08-19 22:00:37
【问题描述】:

我正在做一些事情,我必须解释原始内存地址的值,并且我试图找出大于int 整数类型的存储方式。

为了这个论点,让我们假设一个 32 位架构,其中寄存器大小为 32 位,int 为 32 位,long 为 64 位。关于如何对齐两个寄存器值是否有一些经验法则或指南?

让我们把“它取决于架构/操作系统/语言”的论点排除在外。我知道这方面的任何东西都不是远程可移植或标准化的(实际上,标准中没有特意指定)。我只是好奇这里是否有一般模式。我不会向任何人开枪,任何答案都可能抹去我的硬盘,标准警告。我只是好奇。

我已经足够熟悉了,例如结构打包以及编译器将如何(通常)确保当类型占用的空间小于地址边界时正确对齐 - 但是当它们大于地址边界时会发生什么?

我可以看到几个合理的布局:

假设我们使用地址0x100x11 来存储long 的值,我不知道,99。我将在这里编一些术语:lowint 是长的最不重要的一半,而highint 是最重要的一半。

如果布局是0x10 => lowint0x11 => highint,那么如果类型是intlong 并且不会溢出MAX_INT,则读取0x10 将产生一致的值,这是一个不错的功能 - 0x10 在任何一种情况下都是“99”。我们还占用了两个从我们的基地址向上增长的地址。另一方面,低位和高位似乎“颠倒”了。

如果布局是0x10 => highint0x11 => lowint,那么高低部分是按顺序排列的,但是读取0x10如果它是一个int,将产生“99”,如果它是一个long,则产生“0” - 所以需要对以下地址0x11 进行一些调查,以假设我们正在处理一个长整数,而不是两个整数。我们还在向上成长。

如果布局是0x10 => lowint0x0F => highint,那么我们已经向后增长(即占用了一个奇怪的先前地址来获得我们的第二个存储空间),但我们的 int 是有序的,0x10 的读取是跨数据类型一致。这对我来说似乎是最不可能的,因为它会完全搞砸缓存和数据线读取,但它仍然是另一种选择。

那么最有可能的是什么?我的直觉告诉我选项 2 - 具有两个整数存储空间的有序高低部分 - 对硬件来说是最方便的,但我不肯定这是真的。有没有人有任何布局的轶事证据?

【问题讨论】:

  • 你不是说对齐吗?您帖子的后半部分讨论了组件的顺序,基本上描述了endianness

标签: memory computer-architecture


【解决方案1】:

你在这里问的是endianess。事实证明,大端与小端与混合端是计算机体系结构中的一个主要问题。你提到的第一个(即0x10作为lowint)被称为小端,第二个是大端。

我们不需要混淆加载方向指针很少指向下方,因此根据我的经验,您的最后一个示例永远不会发生。

寄存器确实很重要,因为处理器解释高字节和低字节(字节序)的方式决定了它在内存中的存储方式。在依赖于跨架构移动的特定数据结构的可移植软件中,当处理器的字节序与它正在操作的数据结构的字节序不同时,有必要反转字节顺序。

【讨论】:

  • 好的,明白了——我想我可能被包装问题所困扰。根据维基百科,所有知识的字体:“这种寄存器中的内部位、字节或字序通常不被视为“字节序”,尽管事实上某些 CPU 指令可能会处理单个位(或其他部分) ) 使用各种内部寻址方案。”所以真正的字节顺序是答案,例如如何字节被打包成整数不是技术上字节序,虽然我经常看到作为解释字节序的示例案例:字符打包成一个整数:技术上是“字节排序”。
  • @Matt 正确的字节序更为通用。你的问题和我的回答处理了一个处理字节序的具体案例。我的最后一段特别提到了我对允许寄存器子寻址的几种架构的经验(例如,AX 在 x86 中具有 AL 和 AH),从技术上讲,这确实与字节顺序无关,尽管通常是并行的。
【解决方案2】:

关于两者如何注册是否有一些经验法则或指导方针 价值观是否一致?

对齐(如字节序)是一个内存问题。与寄存器无关

【讨论】:

  • 这就是我试图用“寄存器值”来指代的东西——即存储在一个寄存器指向的值。我不确定“存储在一个寄存器地址的内容”是否有更简洁的术语
猜你喜欢
  • 2012-04-18
  • 2019-12-15
  • 2020-03-25
  • 2013-03-08
  • 2017-06-27
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多