2009-07-22 10 views
-1

インタビュアーは私にこの質問をしましたが、それでも正しい答えがわかりません。.Net Framework継承メモリ管理

シナリオ:私たちは子供のクラスをインスタンス化した場合

私たちは、「基本」クラスとその「子」クラスが存在する継承を持って、今、その親/基底クラスでもあるインスタンス化です。

今インタビュアーが私にこれらの質問を...

インタビュアーは:どのように.NETフレームワークは、この場合にはメモリを管理していますか?ヒープには1つまたは2つのオブジェクトが含まれていますか?

私の返信:1つのオブジェクト。

面接者:それに何のスペースがありますか?

私の返信:Base + Child =メモリのサイズ。

面接官:階層内に100親を持つ子クラスをインスタンス化すると、メモリには101クラスに等しいオブジェクトが含まれます。かなり重いですか?

私の返信:混乱しました!

+0

インタビュアーは「初期化」で何を意味しましたか?それは "インスタンス化"されたのでしょうか? –

+0

そのインスタンス –

+0

なぜ、子クラスが100の親クラスを持つクラス階層を設計したいのですか?それは少し過度ではないですか? –

答えて

1

System.IO.Fileは静的なクラスです。インスタンス化することはできません。

+0

OKですが、貧弱なインタビュアーがFileStreamなどを意味するものとしましょう。( - : –

+0

あなたの2番目の返信が適用されます。 –

1

これは単なる方法です:System.IO.Fileは、ファイルの基本クラス+ファイル自体のサイズを割り当てますが、基本クラスの他の子孫は割り当てません。だから、それほど重くないし、あなたの答えは正しいです。

また、クラスの初期化はクラスごとに1回のみ実行され、クラスのインスタンス化はインスタンスごとに領域を占有します。したがって、初期化ごとのサイズはあまり重要ではありません(範囲内)。

+0

100親を持つ子クラスを初期化する場合、メモリには101クラスに等しいオブジェクトが含まれます。私はそれがかなり重いとは思いませんか? –

+0

クラスに100個の親オブジェクトが存在する階層がある場合、それに対処するために自分のメモリに問題があります。深さ100の階層ツリーは見られませんでした。また、インスタンス変数のみがスペースをとります。インスタンス変数を持たない親は、スペースを取らない。 –

2

基本メンバー+派生メンバー=合計サイズを明確に意味しました。インタビュアーはあなたを混乱させたいと思うように聞こえます。

言い換えれば、管理された言語では、セマンティクスが保持している限り、実装が何でも望みどおりに行うことができ、セマンティクスが直接ポインタを避けることがわかっているからです。あなたが何かを言わなければならない場合は、最寄りの短い答えは、おそらくです:

オブジェクトのサイズ=

  • タイプシステム/ GCオーバーヘッド(たとえば4-8バイトは関係なく、それが入力する内容のヒープ割り当てられたオブジェクトのための固定)
  • +そのタイプとそのベースのすべてのインスタンスフィールド。参照型のフィールドは、machine-int aligned(32ビットのint、64のlong)です。構造体は、一般的には外部的にマシンアラインで整列されていますが、内部レイアウトはさまざまです。どのようにパックするのかわからないboolchar、およびshortのメンバーです。

課題の100塩基の種類99が新しいインスタンスフィールドが宣言を持っていない場合、そのオブジェクトごとの割り当てのオーバーヘッドがゼロです。あるタイプのオーバーヘッドは固定されていますが、私が言ったように、固定されています。

新しいタイプを宣言するためのランタイムオーバーヘッドはわずかです。各タイプは、タイプ記述子のスペースを必要とします(さらにいくつかの追加事項があります)。しかし、これはそのタイプのインスタンスのサイズには影響しません。また、オブジェクトを作成して解放するにつれここで解放している)。

+0

説明してくれてありがとう... –