0

在 x86 系统上,一个内存位置可以保存 4 个字节 (32 / 8) 的数据,因此 64 位系统中的单个内存地址每个内存地址可以保存 8 个字节。在 GDB 中检查堆栈时,尽管情况似乎并非如此,例如:

0x7fff5fbffa20: 0x00007fff5fbffa48  0x0000000000000000
0x7fff5fbffa30: 0x00007fff5fbffa48  0x00007fff857917e1

如果我有这个权利,那么每个十六进制对 (48) 都是一个字节,因此第一个内存地址 0x7fff5fbffa20: 实际上保存了 16 个字节的数据,而不是 8 个。

这让我非常困惑并且已经有一段时间了,所以绝对非常感谢任何输入。

4

1 回答 1

2

简短的回答:在 x86 和 x64 上,最小可寻址实体都是一个字节:每个“内存位置”都包含一个字节,在每种情况下。您从 GDB 看到的只是格式化:它正在转储 16 个连续字节,因为地址从 ....20 增加到 ....30,(在左侧)表明。

长答案:在架构中,32 位或 64 位用于表示许多东西:几乎总是可寻址大小(地址中有多少位 = 您可以直接寻址多少内存 - 再次,内存字节)。它通常还指示寄存器的尺寸,以及(但不总是)本机字长。这意味着通常,即使您可以寻址单个字节,机器也可以使用不同(更长)大小的数据“更好地”工作。“更好”的含义是毋庸置疑的;但是,了解一些背景知识有助于理解对问题中字长的一些误解。

于 2013-01-24T14:40:31.633 回答