2016-08-30 21 views
2

配列に固定されたメモリ領域が割り当てられているとすれば、配列の長さが不変であることが完全にわかります。配列はどのようにメモリ内で扱われますか?

私はArray [10]を持っているとしましょう - これは隣接するメモリの10スロットを割り当てますか?これらのスロットは隣接しており、所定の位置にあるので、索引ベースの検索は迅速です。

しかし、配列に複雑な型を入れていると、サイズが不揃いです配列内の実際のオブジェクトは同じ型であるかもしれませんが、保持するデータのサイズは大きく異なります。

どうすれば.Netがこれを処理しますか?私はオブジェクトに実際のデータを格納するためにシーケンシャルでないメモリを割り当てていると思いますが、これに関する正式な回答が必要です。たとえば、オブジェクトが特定のサイズを超えている場合は、非順次メモリを使用するだけですか?オブジェクトのサイズが常に変化している場合、ストレージの場所を最適化しようとし続けますか?私は、MyClassの配列を持っていると、実行時にサブアレイとサブアレイに割り振る起動する場合、今

public class MyClass 
{ 
    public MyClass[] PotentiallyHugeNestedStructure 
} 

は、このクラスを考えてみましょう。私は、ギザギザの配列の膨大なコレクションで終わることができます。

それでは、.netはどのようにこれをメモリ上で処理しますか?

+3

*配列の実際のオブジェクト*?!いいえ、配列には、オブジェクトのメモリ位置(管理されたヒープ内)への参照が保持され、オブジェクト自体は保持されません。 – user3185569

+0

@ user3185569なので、それらは実際には単にリンクされたリストにすぎませんか? –

+0

'配列内の実際のオブジェクトは同じ型であるかもしれませんが、保持するデータのサイズは大きく異なります。データが異なっても、インデックスごとに割り当てられる記憶域は、割り当てられたメモリと同じ(int 4バイト)そのブロックに格納された値を保持することができます。 – Sherlock

答えて

3

参照型の配列では、配列内の各要素は、マネージヒープ内のオブジェクトを参照する参照を保持します。

したがって、配列自体のサイズの範囲では(指定したとおり)、プリミティブ型の配列上にオブジェクトの配列を持つというデメリットはありません(配列要素参照番号はメモリ内の配列のサイズとは関係ありません)。

インデックスで要素にアクセスする範囲では、インデックスによってアクセスされるため、違いはありません。ヒープから参照によってオブジェクトを取得するためのオーバーヘッドがありますが、非常に高速です(参照は通常、メモリ位置へのオフセットを表す数値なので)。

enter image description here

イメージから:ジェフリー・リヒターによってCLRビアC#

myControlsは、オブジェクトの配列であるので、各要素

下の画像は、アレイ保持値型対参照型を保持する配列を示しNull(デフォルト)またはオブジェクトへの参照(32ビットシステムでは4バイト、64ビットシステムでは8バイト)を保持します。

サイド注:画像で指定されたオーバーヘッドを含む配列についての情報:

  • 寸法
  • 各次元の下限(0はほとんどの場合)
  • の長さアレイ。
+1

_ "したがって、プリミティブ型の配列にオブジェクトの配列を持たせることの欠点は全くありません。リスト内のオブジェクトに非常に高速にインデックスを使用してアクセスできます" _ - さまざまな理由で、このステートメントは危険です間違っている。値型の配列が参照型の配列よりも大幅に優れているシナリオが多数あります。最大の要因の1つは、メモリの局所性とキャッシュへの影響ですが、他にも問題があります。 –

+0

@PeterDuniho私が書いたことは十分にはっきりしていないと思う。私はOPが言ったことへの返答としてそれを言及していた。彼は、オブジェクトの配列は、必要ではないプリミティブ型の配列よりもメモリ内のサイズが大きくなります。いくつかの値の型には参照というより多くのメモリが必要となるため、逆もあります。私は編集が今や明らかであることを願っています。 – user3185569

+0

同等の参照型と同じ効果的なジョブを実行している同等の参照型よりも_more_メモリーを使用する値型の例を示してください。 –

関連する問題