2013-10-07 142 views

回答

3

一個在語言設計的基本原則是,你不應該支付的東西,你不需要。如果你想讓你的成員初始化,你可以讓編譯器這樣做,但如果你不想這樣做,成本將不會被強加給你。

默認初始化只會初始化那些東西,需要被初始化,即,有一個不平凡的默認構造函數,因爲該構造是爲了設置一些不變量是關於目標的重要成員。注意區別並不類型與基本型,而在於是否有一個簡單的構造函數或不:

struct POD { int a; int b; int c; }; 
struct V { virtual void f(); }; 
struct Type { 
    std::string str;  // default initialization calls default constructor 
    V   obj;  // " calls default constructor: vptr must be set 
    POD   pod;  // default initialization leaves this untouched 
}; 
+0

我明白了,但僅僅是爲了爭辯,實際上總是要做零初始化要花多少錢?所有編譯器實現是否都遵守這個規則 – swang

+0

@swang:成員的價值是未定義的,所以實現可以做它的願望。調試模式下的一些實現接受成本並將其初始化爲0(或者一些垃圾易於識別值)。由於標準沒有對價值的承諾做出承諾,因此實施可以使其成爲任何東西。成本是多少?在大多數情況下可能很小,但只要有一種情況會引起注意,就不能強迫用戶選擇。大多數實現在優化構建中遵循規則(即不會初始化)。 –

4

如果您以後要自己初始化數據,那麼您不希望支付將內存初始化爲零以便覆蓋它。

+0

所以它純粹是爲了提高效率?那麼爲什麼不同的值初始化? – swang

+1

@swang:如果你願意,你可以付錢。 –

3

我從來沒有聽說過Bjarne或其他標準委員會成員說語言安全是C++語言設計的指導原則。當然,它適用於Java和其他語言,但是C++語言設計者更可能喜歡效率:

C++是精益和平均的。根本原則是你不支付你不使用的東西。

- Bjarne Stroustrop