2013-03-20 65 views
4

我在訪問中被問到了這個問題。請幫我找到答案。類對象的內存分配

假設你有一個Employee類。有2個變量的原因 - 1.字符串名稱2.詮釋年齡

現在,Employee emp = new Employee();

現在問的問題是:

  1. 在哪裏存儲在內存中的對象EMP在棧或堆,即如何 ?
  2. 那裏的名字和年齡變量存儲在內存中怎麼樣?
  3. 本聲明中的每個單詞都做了什麼,即員工做什麼..然後emp..then = .. then new .. then employee .. then().. then;
  4. 上述聲明與Employee emp之間的區別是什麼; ?根據內存分配進行講解。

請回復您的寶貴意見。

+0

我會提供提示和指針,但我不打算爲你的作業寫一行代碼。 – 2013-03-20 10:04:45

+0

看看這個:http://www.red-gate.com/community/books/under-the-hood-dotnet-memory-management有一個免費的PDF版本,你可以下載。 – 2013-03-20 10:06:58

+1

另一個非常好的資源是'CLR通過C#,第四版'http://shop.oreilly.com/product/0790145353665.do值得購買。 – 2013-03-20 10:07:45

回答

6

你應該看到:堆棧是一個實現細節Part OnePart Two通過埃裏克利珀

1 - 當存儲在內存中即棧或堆和對象如何EMP?

,因爲其由於Employee引用類型是一個類。

2 - 哪裏的名字和年齡變量存儲在內存中又如何?

它們也存儲在堆中。雖然年齡是一種值類型,但是值類型存儲在其容器參考存儲位置。

3 - 這是什麼在這個聲明中的每個單詞做即哪些呢員工 do..then emp..then = ..然後..新員工,然後..然後()..然後,

創建Employee類的新實例命名爲emp

4-是什麼上面的語句和員工 EMP之間的差異; ?根據內存分配進行講解。

Employee emp;意味着只是聲明,沒有實例。這意味着沒有內存分配給對象,它將保存null

+0

關於第4點:或許應該提到將空引用推入堆棧。 – 2013-03-20 10:16:20

+0

@ MatthewWatson,謝謝你,我不知道這件事。如果你喜歡,你可以用詳細的 – Habib 2013-03-20 10:18:45

+0

@MathewWatson編輯答案,這裏的空引用會被推入堆棧或堆上?因爲正如上面的答案所說,對象將被存儲在堆上。 – 2013-03-20 11:16:38

0

哪裏對象emp存儲在內存中,即堆棧或堆,以及如何?

它分配在,因爲你說Employeeclass。類在堆上分配。

那裏的nameage變量存儲在內存中怎麼樣?

這取決於你如何使用它們,可以不同實行框架之間變化。一般來說,想象它們最終會以對象的內存本身結束。

這句話中的每個詞都做了什麼,即員工做什麼..然後emp..then = .. then new .. then employee .. then().. then;

您爲Employee類型分配了必需的存儲器,並將其分配給指針emp。基於它的使用方式,指針emp被推入堆棧

上述聲明與Employee emp之間的區別是什麼; ?根據內存分配進行講解。

Employee emp; 

相同書寫Employee emp = default(Employee);和引用類型默認爲null,所以這是等於寫Employee emp = null;。所以在配置方面應該沒有什麼區別。

如需進一步閱讀:

C# Heap(ing) Vs Stack(ing) in .NET: Part I

+0

您的陳述並不清楚「您爲Employee類型分配了新的內存並將其分配給指針emp。根據指針的使用方式將指針emp推入堆棧或堆。請你詳細說明你想說什麼?當指針emp將被推入堆棧?謝謝 – Mou 2016-10-24 12:55:36

33
  1. 哪裏存儲在存儲器中即堆棧或堆以及對象EMP?

這個問題措辭不佳。 emp不是對象; emp變量,其中包含對象的參考

讓我們改寫了一個問題:

1(a)如果是通過對象提到emp存儲在內存?

變量emp所指的對象被存儲在長期存儲中,也被稱爲「堆」。

1(b)emp是一個變量,因此代表一個存儲位置。內存中的存儲位置在哪裏?

這個問題沒有給出足夠的信息來說。變量emp可能是一個靜態字段,實例字段或局部變量。 (由於分號,它不能是一個形式參數。)如果是本地的,它也可能是一個lambda的封閉外部變量,或迭代器塊的本地或異步方法。所有這些都會改變變量的存儲是在短期還是長期存儲。如果是短期存儲,它可能在堆棧中,或者它可能是一個寄存器。

2哪裏有nameage變量存儲在內存中怎麼樣?

由於它們是類的字段,因此與這些變量關聯的存儲位置總是處於長期堆中。

由於name的類型是string,它所指的東西 - 字符串 - 也在堆上。 (或者,變量可以爲空,在這種情況下,它並不是指什麼。)

3是什麼在這個聲明中的每個單詞做即哪些呢員工do..then emp..then =。那麼新的..然後員工..然後()..然後;

這個問題措辭極爲糟糕。首先,這些不是「單詞」,而是「代幣」。 (並且()兩個令牌。)第二,完全不清楚「做」這個問題的含義。所以我們來問一個不同的問題:

3詳細描述在運行時執行此聲明時執行的操作。

由於問題中沒有足夠的信息,我們不能以任何精度來說。問題說這是一個聲明,所以它不是一個字段聲明。爲簡單起見,假設它不在迭代器塊或異步方法中,並且本地不是任何匿名函數的外部變量。

  • 首先,爲變量分配短期存儲;它很可能會被註冊;如果沒有,它將在堆棧上。它被分配一個空引用。

  • 其次,要求內存分配程序爲堆中的Employee實例生成空內存。它這樣做併產生對該內存的引用。第三,如果這是我們第一次看到Employee和Employee有一個靜態構造函數,那麼靜態構造函數就會運行。

  • 四,靜態ctor完成後,Employee的字段初始值設定項運行。

  • 五,員工的基類構造函數運行。這可能會導致其他靜態構造函數執行。

  • 六,員工的構造函數體運行。

  • 第七,構造函數完成,並且對現在初始化的對象的引用被複制到它的存儲中。

所有這些當然都假定沿途沒有任何東西拋出異常。

4以上聲明和Employee emp;有什麼區別?根據內存分配進行講解。

該問題未包含足夠的信息,以提供準確的答案。如果從不使用局部變量,那麼編譯器可以自由地優化它。如果它沒有優化它,那麼emp的存儲將從短期池中分配,初始化爲空,並且從不使用。

+10

+1但是我懷疑面試官可能會讓你失望,因爲他/她最有可能尋找黑白答案,其中每個值都在棧上,所有對象都在堆上。 – 2013-03-20 15:25:26

+0

@Eric很有幫助..謝謝! – Coding4Fun 2016-05-06 00:32:28