8

面接でこんな質問をされました。その答えを見つけるのを手伝ってください。

クラス Employee があるとします。その中には 2 つの変数があります - 1. 文字列名 2. Int Age

今、Employee emp = new Employee();

ここでの質問は次のとおりです。

  1. オブジェクト emp がメモリに格納されている場所、つまりスタックまたはヒープとその方法は?
  2. name 変数と age 変数がメモリに格納されている場所とその方法
  3. このステートメントの各単語は何をしますか、つまり従業員は何をしますか..then emp..then =.. then new.. then employee.. then ()..then ;
  4. 上記のステートメントと Employee emp; の違いは何ですか? ? メモリ割り当ての観点から教えてください。

貴重なご意見をお寄せください。

4

3 に答える 3

38
  1. オブジェクト emp がメモリに格納されている場所、つまりスタックまたはヒープとその方法は?

質問の言葉遣いが悪い。オブジェクトempではありません。オブジェクトへの参照を含む変数ですemp

それでは、質問を言い換えましょう:

1 (a) によって参照されるオブジェクトは、empメモリ内のどこに格納されていますか?

変数によって参照されるオブジェクトempは、「ヒープ」とも呼ばれる長期ストレージに格納されます。

1 (b)empは変数であるため、格納場所を表します。その保存場所はメモリ内のどこにありますか?

質問は、言うのに十分な情報を提供しません。変数empは、静的フィールド、インスタンス フィールド、またはローカル変数のいずれかです。(セミコロンがあるため、仮パラメーターにすることはできません。) ローカルの場合は、ラムダの閉じた外部変数、イテレーター ブロックのローカル、または非同期メソッドの可能性もあります。これらはすべて、変数のストレージが短期ストレージか長期ストレージかに関係なく変化します。短期ストレージにある場合は、スタック上にあるか、レジスターである可能性があります。

2nameおよびage変数はメモリのどこに、どのように保存されますか?

これらはクラスのフィールドであるため、これらの変数に関連付けられたストレージの場所は常に長期ヒープ上にあります。

nameは型であるためstring、それが参照するもの (文字列) もヒープ上にあります。(または、変数が null である可能性があり、その場合は何も参照されません。)

3 このステートメントの各単語は何をしますか、つまり従業員は何をしますか..then emp..then =.. then new.. then employee.. then ()..then ;

質問の言葉遣いが非常に悪いです。まず、それらは「言葉」ではなく、「トークン」です。(And()2 つのトークンです。) 第二に、質問の「行う」が何を意味するのかが完全に不明です。では、別の質問をしましょう。

3 この宣言が実行時に実行されるときに実行される操作を詳細に記述します。

質問に十分な情報がないため、正確には言えません。質問はそれがステートメントであると言っているので、フィールド宣言ではありません。簡単にするために、それが iterator ブロックまたは async メソッド内になく、 local が匿名関数の外部変数ではないと仮定しましょう。

  • まず、変数に短期ストレージが割り当てられます。登録される可能性があります。そうでない場合は、スタックに置かれます。null 参照が割り当てられます。

  • 次に、メモリ アロケータは、ヒープ上の Employee のインスタンス用に空のメモリを生成するように求められます。そうし、そのメモリへの参照を生成します。

  • 第 3 に、これが Employee を初めて見た場合で、Employee に静的コンストラクターがある場合は、静的コンストラクターが実行されます。

  • 4 番目に、静的 ctor が完了すると、Employee のフィールド初期化子が実行されます。

  • 5 番目に、Employee の基本クラス コンストラクターが実行されます。これにより、他の静的コンストラクターが実行される可能性があります。

  • 6 番目に、Employee のコンストラクタ本体が実行されます。

  • 7 番目に、コンストラクターが完了し、現在初期化されているオブジェクトへの参照がそのストレージにコピーされます。

もちろん、これはすべて、途中で例外がスローされなかったことを前提としています。

4 上記の文と の違いは何Employee emp;ですか? メモリ割り当てに関して教えてください。

質問には、正確な回答を得るのに十分な情報が含まれていません。ローカル変数が使用されていない場合、コンパイラは自由に最適化して削除できます。最適化されない場合、ストレージempは短期間のプールから割り当てられ、null に初期化され、使用されることはありません。

于 2013-03-20T15:19:03.773 に答える
7

次が表示されます: The Stack Is An Implementation Detail第 1部および第 2 部Eric Lippert 著

1 - オブジェクト emp がメモリに格納されている場所、つまりスタックまたはヒープとその方法

heapでは、クラスであるため参照型であるためEmployee です。

2 - name 変数と age 変数がメモリに格納されている場所とその方法は?

それらはヒープにも格納されます。age は値型ですが、値型はコンテナー参照が格納される場所に格納されます。

3 - このステートメントの各単語は何をしますか、つまり従業員は何をしますか..then emp..then =.. then new.. then employee.. then ()..then ;

Employeeという名前のクラスの新しいインスタンスを作成しますemp

4- 上記のステートメントと Employee emp の違いは何ですか? ? メモリ割り当ての観点から教えてください。

Employee emp;インスタンス化ではなく、単なる宣言を意味します。つまり、オブジェクトにメモリが割り当てられず、保持されnullます。

于 2013-03-20T10:06:41.063 に答える
0

オブジェクト emp がメモリに格納されている場所、つまりスタックまたはヒープとその方法は?

あなたが言ったように、それはheapに割り当てられています。クラスはヒープに割り当てられます。Employeeclass

nameおよびage変数がメモリに格納される場所とその方法

これは、それらをどのように使用したかによって異なり、フレームワークの実装によって異なる場合があります。一般に、それらがオブジェクトのメモリ自体で終わるかのように考えてください。

このステートメントの各単語は何をしますか。つまり、従業員は何をしますか..then emp..then =.. then new.. then employee.. then ()..then ;

タイプに必要なメモリをEmployee割り当て、それをポインタに割り当てましたemp。ポインターは、使用方法に基づいて、stackまたはheapempにプッシュされます。

上記のステートメントと Employee emp; の違いは何ですか? ? メモリ割り当ての観点から教えてください。

Employee emp; 

は書き込みと同じで Employee emp = default(Employee);あり、参照型のデフォルトは anullであるため、これは書き込みと同じEmployee emp = null;です。したがって、割り当てに関しては、違いはないはずです。

さらに読むには:

.NET での C# Heap(ing) と Stack(ing): パート I

于 2013-03-20T10:11:36.720 に答える