【发布时间】:2012-08-19 22:00:37
【问题描述】:
我正在做一些事情,我必须解释原始内存地址的值,并且我试图找出大于int 整数类型的存储方式。
为了这个论点,让我们假设一个 32 位架构,其中寄存器大小为 32 位,int 为 32 位,long 为 64 位。关于如何对齐两个寄存器值是否有一些经验法则或指南?
让我们把“它取决于架构/操作系统/语言”的论点排除在外。我知道这方面的任何东西都不是远程可移植或标准化的(实际上,标准中没有特意指定)。我只是好奇这里是否有一般模式。我不会向任何人开枪,任何答案都可能抹去我的硬盘,标准警告。我只是好奇。
我已经足够熟悉了,例如结构打包以及编译器将如何(通常)确保当类型占用的空间小于地址边界时正确对齐 - 但是当它们大于地址边界时会发生什么?
我可以看到几个合理的布局:
假设我们使用地址0x10 和0x11 来存储long 的值,我不知道,99。我将在这里编一些术语:lowint 是长的最不重要的一半,而highint 是最重要的一半。
如果布局是0x10 => lowint、0x11 => highint,那么如果类型是int 或long 并且不会溢出MAX_INT,则读取0x10 将产生一致的值,这是一个不错的功能 - 0x10 在任何一种情况下都是“99”。我们还占用了两个从我们的基地址向上增长的地址。另一方面,低位和高位似乎“颠倒”了。
如果布局是0x10 => highint,0x11 => lowint,那么高低部分是按顺序排列的,但是读取0x10如果它是一个int,将产生“99”,如果它是一个long,则产生“0” - 所以需要对以下地址0x11 进行一些调查,以假设我们正在处理一个长整数,而不是两个整数。我们还在向上成长。
如果布局是0x10 => lowint,0x0F => highint,那么我们已经向后增长(即占用了一个奇怪的先前地址来获得我们的第二个存储空间),但我们的 int 是有序的,0x10 的读取是跨数据类型一致。这对我来说似乎是最不可能的,因为它会完全搞砸缓存和数据线读取,但它仍然是另一种选择。
那么最有可能的是什么?我的直觉告诉我选项 2 - 具有两个整数存储空间的有序高低部分 - 对硬件来说是最方便的,但我不肯定这是真的。有没有人有任何布局的轶事证据?
【问题讨论】:
-
你不是说对齐吗?您帖子的后半部分讨论了组件的顺序,基本上描述了endianness。
标签: memory computer-architecture