2009-02-09 82 views
2

這是一個(希望)非常簡單的問題 - 我最近被告知使用C++樣式初始化比傳統(和更常見的)賦值要好。優化迭代器定義

所以這個代碼:

std::SomeSTLContainer::const_iterator it = container.begin(); 
std::SomeSTLContainer::const_iterator itEnd = container.end(); 

是「慢」或低效率比:

std::SomeSTLContainer::const_iterator it (container.begin()); 
std::SomeSTLContainer::const_iterator itEnd (container.end()); 

我明白這樣做的原因 - 第一個例子引起缺省構造和初始化,然後後來的轉讓而不是第二個例子中的具體構造和直接分配。但是,在現代處理器/編譯器上,它真的有所作爲嗎?

回答

9

我最近被告知使用C++風格初始化比傳統(和更常見的)賦值更好。

這簡直是錯的。

我明白這樣做的原因 - 第一個例子引起缺省構造和初始化,然後隨後指派,而不是具體的建設和直接分配在第二個例子。但是,在現代處理器/編譯器上,它真的有所作爲嗎?

不,它沒有區別。 C++標準明確允許在這種情況下的賦值被省略,以便產生相同的代碼。在實踐中,全部現代C++編譯器都這樣做。

此外,查爾斯是正確的:這將永遠不會調用賦值運算符,而是複製構造函數。但正如我所說,即使這不會發生。

+0

你的「不,它不」是指我的整個第二段或只是「它真的有所作爲?」嗎?題? :)如果前者,你能不能直接給我定位。 – Konrad 2009-02-09 10:30:51

+0

它指的是差異。等等,我編輯它。 – 2009-02-09 10:31:43

3

你的推理不太正確。在定義中使用'='不會導致默認構造和分配。在'最糟'的情況下,它使用'='右邊產生的臨時拷貝構造函數。

如果右側的類型是相同類型或正在初始化的對象的派生類型(const/volatile aside),那麼這兩種構造形式是等價的。

0

不,通常。這是因爲迭代器被編碼爲非常薄的包裝器,並且優化器對於精簡包裝器非常積極。例如。正常的迭代器方法只是一個簡單的指針操作,並且頭部可以使用函數體。這使它變得輕而易舉。在這種情況下,迭代器副本在幕後可能只是一個指針副本,所以同樣適用。

0

這實際上取決於案件和應用的一般經驗法則:措施

如果這些迭代器有很多實例(可能在嵌套循環和排序循環中,那些較短的構造函數可以很容易地發揮作用)。如你所建議的那樣,許多編譯器已經可以自己優化這些。

要真的知道,如果你的編譯器這個只有一個辦法:措施

0
A a = A(arg1, arg2, ...); 

這種分配可以,魯道夫指出,可以通過簡單的結構所取代:這是一個結構。事實上,它會被編譯成的更簡潔

A a(arg1, arg2, ...); 

這主要是一個作風問題等價的,但我不喜歡混合「分配新建分配FY式」建設與「初始式」建築。這樣我就可以在我的代碼中引起一致性。這歸結爲:總是使用初始化風格構造:)。