爲什麼標準在default initialization期間決定不對非類別成員做任何事情,但在value initialization期間執行zero initialization?爲什麼C++默認初始化不會零初始化非類別成員
如果始終在非clss型記憶體上執行零初始化,會更安全嗎?
爲什麼標準在default initialization期間決定不對非類別成員做任何事情,但在value initialization期間執行zero initialization?爲什麼C++默認初始化不會零初始化非類別成員
如果始終在非clss型記憶體上執行零初始化,會更安全嗎?
一個在語言設計的基本原則是,你不應該支付的東西,你不需要。如果你想讓你的成員初始化,你可以讓編譯器這樣做,但如果你不想這樣做,成本將不會被強加給你。
默認初始化只會初始化那些東西,需要被初始化,即,有一個不平凡的默認構造函數,因爲該構造是爲了設置一些不變量是關於目標的重要成員。注意區別並不類型與基本型,而在於是否有一個簡單的構造函數或不:
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
};
我明白了,但僅僅是爲了爭辯,實際上總是要做零初始化要花多少錢?所有編譯器實現是否都遵守這個規則 – swang
@swang:成員的價值是未定義的,所以實現可以做它的願望。調試模式下的一些實現接受成本並將其初始化爲0(或者一些垃圾易於識別值)。由於標準沒有對價值的承諾做出承諾,因此實施可以使其成爲任何東西。成本是多少?在大多數情況下可能很小,但只要有一種情況會引起注意,就不能強迫用戶選擇。大多數實現在優化構建中遵循規則(即不會初始化)。 –
我從來沒有聽說過Bjarne或其他標準委員會成員說語言安全是C++語言設計的指導原則。當然,它適用於Java和其他語言,但是C++語言設計者更可能喜歡效率:
C++是精益和平均的。根本原則是你不支付你不使用的東西。
您不支付你不使用的東西。 – PlasmaHH