繁体   English   中英

Windows x64上可返回的Python 2. * x86(ie32bit)id()函数的最高数目是多少?

[英]What is the highest number Python 2.* x86 (i.e.32bit) id() function on Windows x64 can return?

Python 2.6的x86 id()函数可以返回的最高位数是多少?

我认为上限必须是任何32位应用程序可以看到的内存量,该内存量必须是:2 32 ,即4294967296?

(这很好,因为我必须将此值设置为UInt32或符合CLS的Int64就可以满足的C#类型,这是我关注的原因,尽管与问题无关。)

但是 ,如果我运行的Windows x64的内存超过2GB,比如说32GB的内存,即使Python解释器本身是x86,Python的id()函数是否仍可能返回比2 32高的值呢? ?

我猜想这取决于机器的Python解释器视图-我想WoW64会将64位内存地址转换为32位地址-但是我只是在猜-我需要确定!

链接的文档中

返回(...)一个整数(或长整数)

在amd64上的Python 2.x中,长整数是大于64位的整数。 无论如何,在Python中,整数是无界的。 因此, id可以返回任意长的值

如果必须知道一个确定的最大值,则可以假定平台上的可用内存是所获取整数大小的上限。 因此,我会指定2 2 32 32位,和2 2 64 64个体系结构。 因此,在使用x86 python的情况下,可以以合理的置信度在2 2 32处设置上限。

cpython(最流行的python实现)确实会返回一个内存地址( Python/bltinmodule.c builtin_id ):

static PyObject * builtin_id(PyObject *self, PyObject *v) {
    return PyLong_FromVoidPtr(v);
}

这将是32位/ 64位值,但是行为是实现细节 ,如docs中明确说明的那样。 根据定义,程序员不得依赖实现细节。

我强烈怀疑使用ID会存在合法的用例,更不用说将其转移到另一个程序了。 相反,您应该使用自定义对象表,或仅传输一组。 如果您打算将Python与C#结合使用, ironpython允许您在同一代码中使用。

def func(n):
    max=0L
    for i in range(n):
        x=id(i)
        if x > max : max=x
    return max

for i in range(32):
    x=0L
    try:
        x=func(2**i)
        print '{0: 10}{1: 15}{2: 15}'.format(i,2**i,x)
    except:
        print '{0: 10}{1: 15}{2:>15}'.format(i,2**i,'error')

我认为在实用上id()可以达到的最大值是2 ** 32,但实际上它从未达到如此高的数值。 我在32位体系结构中尝试了上面的代码。 如果我在理解您的问题时犯了任何错误,请告诉我。

4294967296L是2 ^ 32,我达到的最大id()是1460876200。

您的猜测似乎是合理的,但我不知道它们是否正确。

如果您需要依靠行为来实现细节(即未在文档中指定),并且需要确定 ,那么我想唯一要做的就是阅读所使用版本的源代码。并找出其作用。

Windows将在为其编译的环境(32或64位)中运行应用程序,而不是在其运行的CPU上运行。 例如,运行Windows 7的x64计算机将在32位环境中运行32位python。

因此,运行为x86编译的python将始终使用32位地址空间,这意味着id()将始终返回映射到唯一32位指针的值。 (请注意,该实现可能会做一些奇怪的事情,例如给指针加盐或使用64位或类似的疯狂事情。)

假设id()的文档正确,并且CPython(x86)返回了对象的地址,则可以返回的最大值为2 32 -1(4294967295)。 这可以用一个简单的C程序来演示:

#include <stdio.h>

int main(void) {
    void* p = 0;          // specify a pointer at 0
    p = ~p;               // invert all bits
    uintptr_t x = p;      // convert to an integer type fo the same size
    printf("%lu\n", x);
    return 0;
}

无论使用哪种底层OS,都是如此,使用32位指针类型编译的应用程序只能指定0到2 32 -1之间的地址。 注意,由于使用虚拟内存 ,应用程序中可见的地址可能不对应于特定的物理内存地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM