爲什麼在C++中我們更喜歡靜態初始化到動態初始化? 最重要的是什麼?如果靜態初始化如此高效,那麼爲什麼像Java,C#這樣的新語言會使用動態初始化呢?靜態初始化與動態初始化
2
A
回答
2
一般來說,我們不喜歡靜態或動態init。確定哪一個適合特定情況取決於你的特定情況。
8
我們沒有。我們更喜歡自動初始化 - 即在堆棧上創建對象(而不是堆)。如果我們這樣做,他們的一生就是爲我們管理的。這是C++對Java的許多優點之一。至於爲什麼Java是這樣工作的,你應該問問設計師,但我猜測它是簡化垃圾收集(同時引入許多其他問題)。
0
誰說我們做?老實說,這是我第一次聽到這樣的內容。靜態初始化在某些情況下更好,而動態在其他情況下更好。經驗法則是:如果你知道在編譯時多大/多少,然後使用靜態(更簡單,更快輸入,不需要使用智能指針/刪除,沒有內存泄漏)..否則你別無選擇,只能使用動態。
3
的主要原因,甚至有人注意到在C++不同的是,靜態初始化不能依賴於其他全局的內容。因此它不會與初始化順序失敗發生衝突。
因此,如果我將擁有全局變量,我可能更喜歡它們是靜態初始化的,然後按受控順序填充值,而不是按照動態初始化的順序對象不在同一個翻譯單元中。但實際上,「我們」(意思是我)更喜歡在C++中完全不具有全局變量,而當我們確實擁有它們時,我們更願意將它們變成函數範圍靜態而不是全局範圍靜態。所以這是一個非常溫和的偏好,事實上我們不想首先存在的東西是初始化的。
Java那樣靜態初始化的使用類似物的一些事情:最後的靜態整數變成編譯常量,甚至。但是由於Java中的對象總是堆在一起,並且有用戶定義的構造函數,所以對象不能用任何類似於C++靜態初始化的東西來初始化,這是由運行時在任何用戶代碼執行之前完成的。如果您的語言無法完成這兩種選擇中的一種,則性能不是您的考慮因素。每當靜態字段在Java中初始化爲null
時,您可能會說這與C++靜態初始化類似。
相關問題
- 1. 靜態初始化
- 2. 初始化靜態final變量聲明與初始化在Application.OnCreate()
- 3. 靜態或動態初始化
- 4. 動態初始化
- 5. 靜態初始化數組?
- 6. 靜態HashMap的初始化
- 7. 靜態初始化INT
- 8. 靜態屬性初始化
- 9. 靜態變量初始化
- 10. 靜態初始化C++
- 11. 靜態變量初始化
- 12. Spring的靜態初始化
- 13. 初始化靜態結構
- 14. 靜態字段初始化
- 15. 靜態對象初始化
- 16. PHP靜態初始化器
- 17. 初始化靜態向量
- 18. 靜態ImmutableArray未初始化
- 19. 初始化靜態變量
- 20. 靜態初始化混淆
- 21. 靜態變量初始化
- 22. 使用靜態初始化塊與Mockito
- 23. 錯誤枚舉與靜態初始化
- 24. Java中靜態初始化和動態初始化有什麼區別?
- 25. 如何在初始化靜態類之前初始化靜態屬性?
- 26. 靜態初始化期間的資源初始化?
- 27. 初始化後可以初始化靜態變量嗎?
- 28. 初始化列表Vs的靜態常量初始化
- 29. 靜動初始化
- 30. 靜態初始化的Java序列化
+1對於關鍵堆棧與堆區別。我已經微調了你的答案,但如果你不喜歡,請回復。 – Draemon 2010-01-08 18:00:24
較新版本的JVM可以允許分配到堆棧而不是使用-server -XX:+ DoEscapeAnalysis選項的堆。當可以做這種優化時,這可以在性能方面提供一些重大改進。希望這將在Java7中默認啓用 – 2010-01-08 18:34:07