0

id()Python 2.6 の x86関数が返すことができる最大数は?

上限は、32ビットアプリケーションが認識できるメモリの量でなければならないと思います.2 32、つまり4294967296?

UInt32(問題とは関係ありませんが、CLS 準拠で十分な C# 型にこの値を適合させる必要Int64があるため、これで問題ありません。)

しかし、2 GB を超えるメモリを搭載した Windows x64 で 32 GB のメモリを実行している場合、Python インタープリター自体が x86 であっても、Python の関数が 2 32id()より大きい値を返すことは可能ですか?

私はそれが Python インタープリターのマシンの見方に帰着すると推測しています.WoW64 は 64 ビットのメモリアドレスを 32 ビットのアドレスに変換すると思います.

4

5 に答える 5

18

リンクされたドキュメントから:

(...) 整数 (または倍長整数) を返します

amd64 上の Python 2.x では、長整数は 64 ビットより大きい整数です。いずれにせよ、Python では整数に制限はありません。したがって、任意の long 値idを返すことができます。

明確な最大値を知る必要がある場合は、プラットフォームで使用可能なメモリが、取得する整数のサイズの上限であると想定できます。したがって、32 ビットの場合は2 2 32を指定し、64 アーキテクチャの場合は2 2 64を指定します。したがって、x86 python 実装の場合、妥当な確信を持って2 2 32に上限を設定できます。

cpython (最も一般的な python 実装) は実際にメモリ アドレス ( builtin_idin Python/bltinmodule.c)を返します。

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

これは 32 ビット/64 ビットの値になりますが、ドキュメントに明示的に記載されているように、動作は実装の詳細です。定義上、プログラマーは実装の詳細に依存してはなりません。

ID をこれまでに使用したり、ID を別のプログラムに転送したりする正当な使用例があるとは思えません。代わりに、カスタム オブジェクト テーブルを使用するか、セットを転送する必要があります。Python を C# と組み合わせて使用​​する場合は、ironpythonを使用すると同じコードで使用できます。

于 2012-01-13T01:52:03.000 に答える
2
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 です。

于 2012-01-16T09:53:53.167 に答える
1

あなたの推測は理にかなっているようですが、それが正しいかどうかはわかりません。

実装の詳細である動作に依存する必要があり(つまり、ドキュメントで指定されていない)、確認する必要がある場合は、使用しているバージョンのソースコードを読み取るだけでよいと思います。そしてそれが何をするのかを調べてください。

于 2012-01-13T02:16:05.140 に答える
1

Windows は、アプリケーションが実行されている CPU ではなく、コンパイルされた環境 (32 ビットまたは 64 ビット) でアプリケーションを実行します。たとえば、Windows 7 を実行している x64 コンピューターは、32 ビット環境で 32 ビット Python を実行します。

そのため、x86 用にコンパイルされた python を実行すると、常に 32 ビット アドレス空間が使用されid()ます。つまり、一意の 32 ビット ポインターにマップされる値が常に返されます。(実装は、ポインターのソルト化や 64 ビットの使用などの奇妙なこと、またはそのようなクレイジーなことを行う可能性があることに注意してください。)

于 2012-01-16T03:44:40.370 に答える
1

Assuming the documentation for id() is correct and CPython (x86) returns the address of the object, the maximum value that can be returned is 232-1 (4294967295). This can be demonstrated in a simple C program:

#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;
}

This is true regardless of the underlying OS, an application compiled with a 32-bit pointer type can only specify addresses between 0 and 232-1. Note that the address visible in the application may not correspond to a particular physical memory address, due to the use of virtual memory.

于 2012-01-22T17:04:40.140 に答える