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

Memory 大于一个地址整数类型的内存对齐,memory,computer-architecture,Memory,Computer Architecture,我正在做一些我必须解释原始内存地址的值的事情,并且我试图找到基本上大于intintegral类型的存储方式 为了讨论这个问题,让我们假设一个32位的体系结构,其中寄存器大小是32位,int是32位,long是64位。关于如何对齐两个寄存器值,是否有一些经验法则或指南 让我们把“它取决于架构/操作系统/语言”的论点放在一边。我知道这方面的任何东西都不是远程可移植的或标准化的(事实上,故意不在标准中指定)。我只是好奇这里是否有一个普遍的模式。我不会向任何人开枪,任何回答都可能会抹掉我的硬盘,标准警告

我正在做一些我必须解释原始内存地址的值的事情,并且我试图找到基本上大于
int
integral类型的存储方式

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

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

我对结构打包(struct packing)和编译器(通常)如何确保类型在占用的空间小于地址边界时正确对齐非常熟悉,但是当类型大于地址边界时会发生什么

我可以看到一些合理的布局:

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

如果布局是
0x10=>lowint
0x11=>highint
,那么如果类型是
int
long
并且没有溢出MAX_int,则读取
0x10
将产生一致的值,这是一个很好的特性-
0x10
在任何情况下都是“99”。我们还占用了两个比基址更高的地址。另一方面,高低部分似乎“颠倒”

如果布局是
0x10=>highint
0x11=>lowint
,那么高部分和低部分是有序的,但是读取
0x10
会得到“99”如果是int和“0”如果是long-因此需要对以下地址
0x11
进行一些调查,以假设我们正在处理一个long,而不是,比如,两个整数。我们仍然在向上成长

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

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

关于这两个词如何注册,有什么经验法则或指南吗 值是否对齐


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

您在这里所问的是指什么。事实证明,大端、小端、混合端是计算机体系结构中的一个主要问题。您提到的第一个(即0x10为lowint)称为小端,第二个称为大端

我们不需要混淆加载方向,如果我们从0x10加载16位,那么无论endianess方案如何,我们都将从0x10和0x11获得两个字节。指针很少指向下方,所以根据我的经验,你的最后一个例子永远不会发生


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

您是否碰巧没有谈到对齐?你文章的后半部分讨论了组件的顺序,基本上描述了。这就是我试图用“寄存器值”来指的,即存储在一个寄存器指向的位置的值。我不确定是否有更简洁的术语来描述“存储在一个寄存器地址的内容”好的,明白了-我想我可能是因为包装问题。根据Wikipedia的说法,所有知识的字体都是:“这种寄存器中的内部位、字节或字顺序通常不被认为是“endianness”,尽管一些CPU指令可能使用各种内部寻址方案对单个位(或其他部分)进行寻址。”因此真正的endianness就是答案,例如,字节如何打包到int中并不是技术上的endianness,尽管我经常将其视为解释endianness的示例:字符打包到int中:技术上的“字节排序”。@Matt Correct endianness更一般。你的问题和我的回答涉及一个关于持久性的具体案例。我的最后一段特别提到了我在几种允许寄存器子地址的体系结构(例如x86中AX有AL和AH)方面的经验,从技术上讲,这是独立于endianess的,尽管通常是并行的。