1

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

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

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

我对结构打包以及编译器将如何(通常)确保在它们占用的空间少于适合地址边界的空间时正确对齐 - 但是当它们大于地址边界时会发生什么?

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

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

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

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

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

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

4

2 回答 2

2

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

我们不需要对加载的方向感到困惑如果我们从 0x10 加载 16 位,那么无论采用哪种字节序方案,我们都会从 0x10 和 0x11 获得两个字节。指针很少指向下方,因此根据我的经验,您的最后一个示例永远不会发生。

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

于 2012-08-19T22:17:01.870 回答
1

关于两个寄存器值如何对齐,是否有一些经验法则或指南?

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

于 2012-08-19T22:08:30.940 回答