2017-11-04 16 views
-2

私は1年間Pythonを学んでいます。講義スライドでは、コンパイラが通常、リストに項目を格納するために4バイトを割り当てていることがわかります。リスト内の項目に必要なメモリ

コンパイラがメモリを動的に割り当てることができないのはなぜですか?例えば、私が小さな値を持っている場合、コンパイラーはそれを格納するために1または2バイトを割り当てません。なぜならそれはより効率的なメモリでしょうか?

+1

内部的には、CPythonの 'list'はポインタの配列を使って各項目への参照を格納します。これらのポインタは、32ビットマシンでは4バイト= 32ビット、64ビットマシンでは8バイトを占有します。アイテム自体は、 'list'で' sys.getsizeof'を呼び出すと報告されないさまざまな量のRAMを占有します。 –

+0

私はこの印象をどこで得たのか分かりません。基本的に、リストと配列は非常に異なるデータ構造であるため、それらを混在させるべきではありません。プリミティブ配列はサイズが決められており、エレメントにはさまざまなサイズを使用できます。たとえば、数字だけでは、8,16,32、および64ビットの整数を持つことができます。 CPythonでは、リストはPy_Objectポインタの動的配列として実装されています。各ポインタは通常マシン語を使用するため、64ビットシステムでは8バイト、32ビットシステムでは4バイトとなります。しかし、これはPythonオブジェクトのメモリを考慮していません。これは任意の大きさになる可能性があります。 –

答えて

0

1ビットが符号ビットで31ビットが数値を表す32ビット整数とは何ですか? 1バイトは8ビットに相当し、整数は32ビットなので、なぜ8バイトで表されるのでしょうか?64ビットを見るコンピュータによっては4バイトbtwが浪費されますが、8バイトしか使用できません。あなたが表現できる数字です。より多くのビット==>より大きいnumber.Itは単にあなたのプロセッサーについて行く、それはレジスタです。

0

リストまたは配列内の要素が4バイトであるとは限りません。

強力な静的型(つまり、変数を使用する前にその型を宣言する必要がある)の言語では、配列のサイズは配列のサイズとその型の各変数のサイズを掛けます。 Cでは、char型は通常1バイトを使用し、int型はシステムのアーキテクチャに依存するバイト数を使用します。

Pythonのような動的型の言語では、すべての変数はポインタ(データが実際に格納されているメモリ内の場所)とラベル(変数の型を示し、実行時に使用されます)操作を実行するときの変数の動作を決定する)。

4バイトの問題は、多くのアーキテクチャで整数に4バイトが使用されるという事実を指していると思われますが、これは偶然であり、ルールであると考えています。

+0

これは本当であり、使用しているプロセッサによって異なります。 64ビットプロセッサでは、64ビットのレジスタを考えることができるので、2 * 32ビットの整数を扱うことができます。 –

+0

ほとんどのプログラミング言語やプロセッサに一般化されていないという意味では当てはまりません。私が言ったように、それは特定のケースでは真実かもしれませんが、ほとんどの言語ではそうではありません。 – Tiago1984

+0

さて、あなたは限界に縛られていない一つの命令的言語を教えてもらえますか? –

関連する問題