在x86系统上,内存位置可以容纳4个字节(32/8)的数据,因此64位系统中的单个内存地址可以容纳每个内存地址8个字节。在GDB中检查堆栈时,虽然情况并非如此,例如:
0x7fff5fbffa20: 0x00007fff5fbffa48 0x0000000000000000
0x7fff5fbffa30: 0x00007fff5fbffa48 0x00007fff857917e1
如果我有这个权利,则每个十六进制对(48)是一个字节,因此是第一个存储器地址 0x7fff5fbffa20:实际上是持有16个字节的数据,而不是8个。
这让我非常困惑并且已经有一段时间了,所以绝对非常感激任何输入。
答案 0 :(得分:1)
简答:在x86和x64上,最小可寻址实体是一个字节:每个“内存位置”在每种情况下都包含一个字节。你从GDB看到的只是格式化:它正在转储16个连续的字节,因为地址从...... 20增加到...... 30,(在左边)表示。
长答案:32位或64位用于表示很多东西,在一个架构中:几乎总是,是可寻址的大小(地址中有多少位=你可以直接寻址多少内存 - 再次,字节的记忆)。它通常还指示寄存器的维度,以及(但不总是)本机字大小。 这意味着通常,即使您可以处理单个字节,机器也可以使用不同(更长)大小的数据“更好”地工作。什么“更好”意味着超越问题;然而,有一点背景知道了解问题中有关字大小的一些误解。