2010-01-08 112 views
2

爲什麼在C++中我們更喜歡靜態初始化到動態初始化? 最重要的是什麼?如果靜態初始化如此高效,那麼爲什麼像Java,C#這樣的新語言會使用動態初始化呢?靜態初始化與動態初始化

回答

2

一般來說,我們不喜歡靜態或動態init。確定哪一個適合特定情況取決於你的特定情況。

8

我們沒有。我們更喜歡自動初始化 - 即在堆棧上創建對象(而不是堆)。如果我們這樣做,他們的一生就是爲我們管理的。這是C++對Java的許多優點之一。至於爲什麼Java是這樣工作的,你應該問問設計師,但我猜測它是簡化垃圾收集(同時引入許多其他問題)。

+1

+1對於關鍵堆棧與堆區別。我已經微調了你的答案,但如果你不喜歡,請回復。 – Draemon 2010-01-08 18:00:24

+0

較新版本的JVM可以允許分配到堆棧而不是使用-server -XX:+ DoEscapeAnalysis選項的堆。當可以做這種優化時,這可以在性能方面提供一些重大改進。希望這將在Java7中默認啓用 – 2010-01-08 18:34:07

0

誰說我們做?老實說,這是我第一次聽到這樣的內容。靜態初始化在某些情況下更好,而動態在其他情況下更好。經驗法則是:如果你知道在編譯時多大/多少,然後使用靜態(更簡單,更快輸入,不需要使用智能指針/刪除,沒有內存泄漏)..否則你別無選擇,只能使用動態。

3

的主要原因,甚至有人注意到在C++不同的是,靜態初始化不能依賴於其他全局的內容。因此它不會與初始化順序失敗發生衝突。

因此,如果我將擁有全局變量,我可能更喜歡它們是靜態初始化的,然後按受控順序填充值,而不是按照動態初始化的順序對象不在同一個翻譯單元中。但實際上,「我們」(意思是我)更喜歡在C++中完全不具有全局變量,而當我們確實擁有它們時,我們更願意將它們變成函數範圍靜態而不是全局範圍靜態。所以這是一個非常溫和的偏好,事實上我們不想首先存在的東西是初始化的。

Java那樣靜態初始化的使用類似物的一些事情:最後的靜態整數變成編譯常量,甚至。但是由於Java中的對象總是堆在一起,並且有用戶定義的構造函數,所以對象不能用任何類似於C++靜態初始化的東西來初始化,這是由運行時在任何用戶代碼執行之前完成的。如果您的語言無法完成這兩種選擇中的一種,則性能不是您的考慮因素。每當靜態字段在Java中初始化爲null時,您可能會說這與C++靜態初始化類似。