![](/img/trans.png)
[英]Building Python extension fails ("kernel32.lib" cannot be opened | "x64" conflicts with target machine type "x86")
[英]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.