大于一地址整数类型的内存对齐

时间:2012-08-19 22:00:38

标签: memory computer-architecture

我正在做一些必须解释原始内存地址值的内容,并且我试图找到如何存储大于int整数类型的内容。

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

让我们得到"它取决于架构/操作系统/语言"争论不受阻碍。我知道这个领域没有任何东西可以远程移植或标准化(事实上,有意没有在标准中规定)。我很好奇这里是否有一般模式。我不会射杀任何人,任何答案都可能会抹掉我的硬盘,标准警告。我只是好奇。

我对...非常熟悉struct packing以及编译器如何(通常)确保类型在占用的空间小于地址边界时正确对齐 - 但是当它们大于地址边界时会发生什么?

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

假设我们正在使用地址0x100x11存储long的值,我不知道,99。我将在此处列出一些术语:{ {1}}是长期中最不重要的一半,lowint是最重要的一半。

如果布局为highint0x10 => lowint,那么如果类型为0x11 => highint0x10,则读取int会产生一致的值并且没有溢出MAX_INT,这是一个很好的功能 - long是" 99"在任一情况下。我们还会占用基地址向上的两个地址。另一方面,低和高的部分似乎已经反转了#34;

如果布局为0x100x10 => highint,那么高低部分都是有序的,但读取0x11 => lowint将产生" 99"如果它是一个int和" 0"如果它很长 - 所以需要对以下地址0x10进行一些调查,以假设我们处理的是一个长的,而不是两个整数。我们还在成长。

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

那么最有可能的是什么?我的直觉告诉我,选项2 - 有序的高低部件有两个存储空间 - 对硬件来说是最方便的,但我并不认为这是正确的。任何人都有任何布局的轶事证据吗?

2 个答案:

答案 0 :(得分:2)

这里你要问的是endianess。事实证明,big-endian vs little-endian vs mixed-endian是计算机体系结构中的一个主要问题。你提到的第一个(即0x10为lowint)被称为little endian,第二个是big endian。

我们不需要在加载事物的方向上迷惑如果我们从0x10加载16位然后我们将从0x10和0x11获得两个字节,无论结束方案如何。指针很少指向下方,所以根据我的经验,你的最后一个例子永远不会发生。

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

答案 1 :(得分:1)

  

是否有一些关于如何注册的经验法则或指南   价值是一致的?

对齐(如endianess)是一个内存问题。它与寄存器无关