2012-11-18 89 views
0

當我聲明變量併爲該變量創建對象時,在後臺(在內存的情況下)會發生什麼。參考變量是否存儲在任何地方以及以何種格式以及該變量如何指向堆上的內存。請在下面澄清評論中的疑惑。什麼是佔用的內存空間供參考和對象

例如

ClassA instance;  // Where this variable store and how much memory occupies 
instance=new ClassA(); //How instance variable points to memory 

編輯

如果我的計劃包含了許多未使用的變量在我的程序存儲器將影響。

回答

1

實例變量只是運行時的指針,它指向GC堆中分配的對象。變量可以在任何地方生存,堆棧,CPU寄存器,在堆中的另一個對象中,或者在堆中是靜態的。

有關垃圾回收器的一件大事就是它能夠在垃圾回收期間找到這個指針。因此可以看到該對象仍然被引用,並且可以在壓縮堆時調整指針值。當引用在另一個對象內部是靜態的時候,這是相當直接的。當它在堆棧或寄存器上時更加困難,抖動提供足夠的信息讓GC找到它。

1

引用本地變量的存儲位置依賴於平臺(抖動可以選擇他們想要存儲它的位置)。通常它將位於調用堆棧上的內存中,用於定義本地或CPU中的方法寄存器。大小也取決於平臺,但32位體系結構通常爲4個字節,64位體系結構爲8個字節。

該引用可能會或可能不會「指向」堆。最好將其視爲可用於訪問對象的不透明引用標識符。基礎指針可以在運行時改變。

關於未使用的變量,優化編譯器通常會完全消除任何未使用的局部變量,因此它對運行時性能完全沒有影響。此外,您正在討論的用於存儲參考的開銷類型對於現代平臺而言是微乎其微的。

1

參考變量以內聯方式存儲。如果它是一個局部變量,它將被分配到堆棧上,如果它是一個類的成員,則它將作爲堆中對象的一部分進行分配。

一個類的實例始終分配在堆上。

引用只是一個指針,但特別的是垃圾回收器知道引用。因此,引用使用指針使用的空間量。在32位進程中它使用4個字節,在64位進程中它使用8個字節。

0

如果您需要關於此問題的答案,那麼我會建議您通過C#獲得「CLR」,它是一本關於CLR功能的書籍,它包含大量有關此信息的信息。

要回答你的問題,有很多事情你需要考慮回答這個問題。

例如,您需要在類中存儲每種方法的說明。當這個類第一次加載時,這將成爲一個指向.Net IL指令的指針。當應用程序首先需要該方法時,它將被編譯爲處理器的實際指令,並將其存儲在內存中。

然後,您將擁有類字段的靜態存儲,每個類只能存儲一次。

實例化的.Net中的每個類都需要存儲,原因有很多,但不限於繼承,垃圾回收,佈局等。然後,您可以存儲各種引用,您可以將這些引用保存到本身需要存儲的對象中。

如果內存對您所做的事情確實非常重要,那麼C#可能不是您的應用程序的最佳選擇。否則,只要享受使用.NET會帶來的生產效益,並且接受這種易用性來自C/C++應用程序的內存使用價格和性能(在某些情況下)會降低性能。

相關問題