2017-05-27 16 views
0
var Arr1; 
var Arr2 = []; 

(想定ARR1が未定義VARとして開始し、必要に応じて、後で配列になります)(Javascript)空の配列と未定義のメモリオーバーヘッドvar?

がARR1の億ARR2の十億と同じメモリフットプリントを持っていますか?どちらも技術的には空ですが、Arr2はオブジェクトそのものの定義にいくらかのオーバーヘッドが必要であることを意味するオブジェクトです。いいえ?

+0

同じ言語ではありませんが、同じ手順ではありません:https://stackoverflow.com/a/2430672/6634591 – Luca

+0

メモリ内に何千もの未使用の配列が必要なのは、アプリケーションの設計上の問題ですか? – ste2425

+1

@ ste2425:問題ではありません。効率性を念頭に置いて設計する際には、常に境界条件に行き、極端に何が起こるかを見ます。しかし、私はあなたにも例を挙げることができます:各スクリーンオブジェクトがライン、ポリライン、カーブ、サーフェスのコレクションであるWebGLゲームがあるとします。しかし、今日、すべてのスクリーンオブジェクトが100万のサーフェスになると仮定し、未使用のライン/ポリライン/カーブ、オブジェクトプロパティがメモリフットプリントに多すぎるようにします。 –

答えて

2

var Arr1は、何も参照しないメモリフットプリントを作成します。だから、はい、これにはコストがかかりますが、それは最小です。

しかし、var Arr2 = []は、新しいArrayオブジェクトへの参照を保持するメモリアドレスを作成するため、そこにはさらにフットプリントがあります。配列が空であっても、Arrayオブジェクトの一意のインスタンスです。オブジェクト自体は、Array.proototypeを継承しています。十億の空の配列でもまだ格納されていないものを格納する必要がないので、実際にメモリを占有するのはArrayの集まりです。Array.prototype。 10億の空の配列があっても、それらはすべてただ1つのArray.prototypeオブジェクトから継承し、それが配列のネイティブAPIが格納される場所です。

+0

素敵な説明 –

+0

私が尋ねた理由は、(たとえ空であっても)スタック内にまだ10億のインスタンスが存在するということです。各インスタンスにはスペースを定義する必要があります。私は配列がJavascriptで内部的にどのように実装されているか、各空の配列インスタンス変数に必要なバイト数を確認していません。 –

+0

実際のストレージフットプリントは、実装によって異なります。しかし、このプロセスは似ていますが、作成する配列要素と追加のプロパティだけが新しい配列に格納される点が異なります。すべての基本機能はプロトタイプに一度だけ保存されます。 –

関連する問題