2010-01-12 23 views
1

這可能有點偏離「正確答案,不討論」的話題。放棄控制:機器代碼生成vs內存佈局?

不過,我想調試我的思維過程,所以也許有人能幫助我:

我使用的編譯器所有的時間,而我放棄了在機器代碼生成控制的事實(佈局我的緩存,以及電子的流動)不會打擾我。

但是,放棄對內存佈局(能夠放置內存的東西)和內存管理(垃圾收集)的控制,現在仍然困擾着我。

有沒有人處理過這個?如果是這樣,你是怎麼過去的? (特別是,我經常感覺C++比Java更「安全」。)

謝謝!

+1

調查鏈接器文檔。許多鏈接器允許您將位置(段)分配給變量。我唯一關心編譯器和鏈接器放置事物的地方是當我使用嵌入式系統時。 – 2010-01-12 17:49:55

回答

4

你的感覺自然是非常主觀的。

在C++中管理自己的內存空間可能會感覺很舒服。其他人可能會喜歡Java爲您管理堆的簡單性,並將內存管理開銷降至最低。

編程域也有影響。例如,在嵌入式環境中,您很可能無權享受垃圾收集機制,無論您是否喜歡,都可以管理自己的內存。

底線 - 主觀和領域依賴。

1

如果您信任具有代碼生成功能的JVM,爲什麼不相信它與數據生成呢?

請注意,類似的事情在CPU高速緩存大小可能會影響你的對象的最佳位置,那基本上JIT比你懂得多,因爲它可以測量並採取行動的過程。

+0

爲何不相信數據生成? http://www.cs.virginia.edu/kim/publicity/pldi09tutorials/memory-efficient-java-tutorial.pdf可能是一個可能的答案。 ;)雖然這比Java語言和類庫的JVM的錯誤少 – jalf 2010-01-12 12:30:12

1

如果您曾經在C++下使用過COM,那麼使用「Release()」確實沒有區別。這個夢想可能會或可能不會被釋放,或者當它使用它的東西已經完成使用時,它可能會被釋放。

要做的最好的事情就是假設它的工作,並停止擔心它。

0

原始海報詢問了(a)內存佈局和(b)內存管理。以前的答案只是談論內存管理。

關於內存佈局,要搜索的關鍵字似乎是「結構」。

C和C++都有內存佈局控制。 D也應該如此。

它似乎(基於快速搜索)Java沒有。

C#已通過結構賦予內存佈局控制權。請參閱:
堆棧溢出:incorrect members order in a C# structure
http://www.developerfusion.com/article/84519/mastering-structs-in-c/

Go的數據結構被稱爲「結構」,但如果他們授予他對內存佈局的控制,我不能告訴。 (我懷疑他們這樣做,但一直未能證實這一點。)

我歡迎任何更正/補充上述內容。

(關於內存管理,我很樂意讓語言/平臺去做。)