2016-10-08 5 views
1

私はCSのコンセプトに錆びていて、this reviewを見ていて、9時頃には配列が固定長であると言います。これは、他のメモリロケーションを他の場所に割り当てることができるように、事前に構造体に割り当てるメモリの量をスタックに伝える必要があるためです。配列のようなJavaScriptのデータ構造はなぜ固定長ではないのですか?

私は現在JavaScriptの開発者ですが、これまでJavaで作業していました。 JavaScript配列を動的に割り当てることができるのはなぜですか([].push(element))?

JSの配列は「長さ」の概念を持たないオブジェクトであることを理解していますが、配列の長さを要求してその値にアクセスできるときは混乱します。配列のようなインデックス

これは、JSオブジェクトがヒープメモリとしか相互作用しないことを意味しますか? JSの固定長構造の概念はありますか?

+0

C#のリストのと同じ方法 – amd

答えて

3

Javascript配列のこの側面は、間接レベルを追加することで実装できます。

アレイを連続したメモリ領域にするのではなく、配列をポインタの連続したメモリ領域にすることができます。

この方法でも、インデックスによる要素アクセスはO(1)になりますが、要素を別の大きな連続領域に移動することで要素数を増やすことができます。

これは、C++が例えばstd::vectorで行う処理です。

通常、これらのポインタへのポインタデータ構造体は、「塗りつぶしポインタ」で実装されています。私。配列のサイズを大きくする必要がある場合は、必要な要素だけを割り当てますが、将来はさらに多くの要素が追加されるのを待って余分なスペースが残されます。

beyond_lastend_of_storage間のスペースはあなたがベクターに push_backしたいと思う次のオブジェクトのための準備ができたメモリ領域である
struct Vector { 
    Element *first; 
    Element *beyond_last; 
    Element *end_of_storage; 
}; 

:たとえば

は、C++でstd::vectorは通常のようなものを用いて実装されます。この方法では、すべての追加ごとに全体を再割り当てする必要はありません。

1

はい、固定長のデータ構造がJS:型付き配列にあります。

var arr = new Uint8Array(50); 
 
console.log(arr.length); // 50 
 
arr[99] = 123; 
 
console.log(arr.length); // still 50

関連する問題