2016-09-24 5 views
0

私はノードが通常8バイトであることを理解しています。値は4、単独リンクされたリストのポインタは4です。リンクされたリストの場合、 "オーバーヘッド"メモリは何を指していますか?

これは、二重にリンクされたリストノードが2つのポインタを持つメモリ内の12バイトであることを意味しますか?

また、12バイトのノードごとに8バイトの「オーバーヘッド」がどのようになっているのか、この本は読んでいます。

答えて

2

まずポインタと値が4バイトであることから、32ビットマシンについては明らかです。明らかに、それは64ビットマシンでは違います。

第2に、値は4バイトである必要はありません。頻繁に値はポインタまたはintで、その場合は(32ビットマシンでは)4バイトです。しかし、例えば2倍の場合、8バイトになります。実際、ペイロードはどのタイプでもよく、そのタイプのサイズを持つことができます。

第三に、あなたの本はおそらく二つのポインタを参照している - リンク - として「(ヒープマネージャ 『)。オーバーヘッド」

第四に、あなたの本は、メモリマネージャの影響を省略している』よく、。アラインメントの問題やヒープ管理の問題のため、ヒープ要素は実際に要求されているよりも大きくなります。32ビットマシンのヒープ実装の大半は、12を要求するときに12バイトを割り当てません.16バイトを割り当てます(最後の4バイトあなたのプログラムでは使用されていません)。多くのマシンでは、特定の値(例えば倍精度)の8バイトアライメントがマシンアーキテクチャによって要求されるか、パフォーマンス上の理由から望ましいものです。つまり、コンパイラの実行時のヒープ実装)それが課すオーバーヘッドの種類。さらに、いくつかのヒープ実装(多くの?)は、割り当てられたオブジェクトの内部で実際にメモリを使用して、独自の簿記を行います。この場合、そのヘッダー量は時には4バイトと小さいこともありますが、通常、倍精度の場合は8バイトのアライメントが必要なほとんどのマシンでは8バイトです。したがって、通常の場合、12バイトを要求すると、が実際にになります。バイト:ヒープオーバーヘッドが8バイト、データが12バイトです。これは20バイトなので、 !

+0

ありがとう、4番目の説明は、ヒープによって割り当てられた余分なメモリがあることを意味します。オーバーヘッドはポインタを参照していないので、両方のポインタを持つNode自体として12バイトを指定します。私が持っているもう一つの質問は、ヒープがどのくらいのメモリを割り当てるかを決定することです。なぜ4または12の代わりに8バイトですか?あるいは、これは言語実装のタイプの質問ですか? – driftdrift

+0

言語に依存する可能性があります。より多くの場合、実装に依存します。多くのアーキテクチャでは、アラインされていないアクセスが許可されていません。たとえば、8バイトのdouble(64ビット浮動小数点)の値がある場合、そのdoubleのアドレスはこれらのアーキテクチャの8の倍数でなければなりません。そのため、コンパイラは、オブジェクトが開始されてから測定された8バイトの境界に二重のフィールドがあることを確認し、ヒープ(コンパイラの実行時のものか、オペレーティングシステムのものか)に依存して、 8バイトの境界で。 – davidbak

0

これは、二重リンクリストノードが2つのポインタを持つメモリ内の12バイトであることを意味しますか?

はい、データが4バイトで、コードが64ビットではなく32ビット用にコンパイルされている場合、ポインタあたり4バイトです。

また、12バイトのノードごとに8バイトの「オーバーヘッド」がどのようになっているかについて、この本で読んでいます。

は、2つのポインタに使用されている8バイトを参照することになります。しかし、は、12バイトを割り当てるときにメモリマネージャ自身のオーバーヘッドも参照することがあります。メモリマネージャは、通常、メモリを解放するときに使用される追跡情報(デストラクタ呼び出しのクラス型、配列要素数など)を格納できるように、要求されたよりも多くのバイトを割り当てる必要があります。

+1

"' malloc() '/' new'は 'free()'/'delete'で使用されている情報を追跡する必要があるため、要求されたバイト数より多くのバイトを割り当てます。 - ほとんどの場合:はい。ときどき:いいえ。もちろん、ヒープの実装に依存します。 (さらに、この質問にはC/C++タグはありません。だから、おそらく 'malloc' /' new'とは限りません!) – davidbak

+0

@davidbakおそらく。しかし、現実的には、非C/C++言語で使用されるリンクリストはどのくらいの頻度で使用されていますか? –

+0

LISP(およびLISP誘導体)?ハスケル(および他の言語の言語)?アセンブリ? – davidbak

関連する問題