引用结构通常会使用64位还是32位?

时间:2018-10-11 09:03:41

标签: python-3.x

我了解到引用需要64位:

  

也就是说,引用结构通常使用 64位作为存储在数组中的内存地址,而不管用于表示被视为元素的对象的位数是多少。

我如何看待它呢?

In [75]: patients = ["trump", "Trump", "trumP"]
In [76]: id(patients[1])
Out[76]: 4529777048
In [77]: math.log2(4529777048)
Out[77]: 32.076792897710234

它是2**32而不是2**64

2 个答案:

答案 0 :(得分:1)

使用math.log2(id(obj)),您会问“ 2提升到obj的地址才能赋予我们内存中的地址?”。

这不是id()的工作方式。 id()为每个对象提供恒定且唯一的值。在CPython中,这是对象在内存中的地址。

在64位系统上,将此地址存储在64位变量中是有意义的,因为您将无法使用32位变量覆盖整个地址空间。

但是64位引用并不意味着每个对象的地址均为2**64。截至2018年,由于我们的x86_64电脑具有just a 48-bit address space,这甚至是不可能的。您的第一个病人的身分在2**32附近是(主要)巧合。

答案 1 :(得分:1)

id将返回内存中的地址。因此,这不是您想要的。

通常,使用sys.getsizeof()来获取Python内存大小的一种方法。但是,这将返回对象的大小。您对该对象的引用大小感兴趣。

不过,您仍然可以按以下方式或多或少地计算此值:8 * struct.calcsize("P")。这基本上可以显示您是在32位还是64位系统上,因此您知道引用的大小。但实际上是通过检查参考来计算的,我不知道是否可行。