我有3個成員變量的類聲明爲public, 我可以初步明確它在任何地方的代碼,還是我寫的構造與初始值不此構造影響性能開銷?構造函數是否影響性能?
class ABC{
public:
int a;
int b;
int c;
ABC(): a(0) , b(0), c(0)
{
}
};
請讓我知道構造函數是否會增加性能開銷?
我有3個成員變量的類聲明爲public, 我可以初步明確它在任何地方的代碼,還是我寫的構造與初始值不此構造影響性能開銷?構造函數是否影響性能?
class ABC{
public:
int a;
int b;
int c;
ABC(): a(0) , b(0), c(0)
{
}
};
請讓我知道構造函數是否會增加性能開銷?
它初始化了int
的到零,這是良好的概率,並採取的時間smalll量。
它大致有完全相同的性能,這一點:
int a = 0;
int b = 0;
int c = 0;
含義對性能的影響是如此微不足道的完全你不應該永遠擔心。
初始化可能會出現一個小的成本。但是:
如果編譯器能證明它們是不必要的,編譯器可能能夠消除初始化。
即使有小的成本,這是壓倒性的可能,它是整個應用程序的上下文完全無關。您可以使用分析器來量化性能影響。
它可以讓你知道,這三個領域總是會得到初始化,從而消除了某些類型的潛在的bug的保證。
是和否。
是的,它確實增加了一些性能開銷,因爲你讓計算機做一些操作,而在默認情況下,它不會初始化基本類型的成員。
不,它不增加實踐中的性能開銷,因爲操作將花費微不足道的時間。此外,你需要一些時間來初始化領域反正(你永遠不會與未初始化下地幹活,你願意嗎?)。因此,當您需要更改初始值時,您只會支付實際的性能開銷。 但你可以通過定義一個第二構造函數(這需要參數)實現權初始值,你應該,這樣就可以避免默認的構造函數調用時你不感興趣,相反,通話一個構造函數,它使您的對象完全按照您的需要進行初始化。
對於一般問題並構造影響性能,答案是這取決於。
一般情況下,你要使用的初始化列表時,你可以(否則你可能會在一個默認的構造招致然後拷貝賦值,請參閱this question進一步解釋)。如果你提供一個非拋出移動構造函數(即noexcept(true)
),像push_back
這樣的操作將使用這樣的(推測是便宜的)構造函數(否則操作將複製值,可能會更昂貴)。
我相信其他人可以想出其他原因。
最後,我將重點介紹如何獲得某些工作。如果你確定(在適當的分析後)你的構造函數是一個瓶頸(我非常懷疑它),然後擔心改進它們。否則,你可能會浪費你的時間在完全不相關的納米優化。
注:
我在回答這個問題做了兩個大錯誤。我已經從答案中刪除了他們。請參閱此評論的歷史瞭解更多信息。
真的嗎?你是否閱讀另一個規範比我?你能否參考標準的具體部分來說明這一點,因爲我想了解你是如何得出這個結論的。 –
這不是標準所說的,也不是大多數編譯器所做的。這些變量保持未初始化,任何嘗試從它們讀取都是未定義的行爲。 –
相反的結論很容易得出:C++草案n3290,§8.5,¶11:「*如果沒有爲對象指定初始化程序,則該對象將被默認初始化;如果未執行初始化,則會自動或動態存儲一個 對象*「 –
除非你每秒調用構造函數數百萬次,否則它是不相關的。 –
如果編譯器能夠證明你以後總是明確地在所有代碼路徑上初始化它,那麼編譯器應該能夠將它優化爲死分配。同樣,如果您將其分配給所有後續代碼路徑,copy-elision都應該啓動。 – Mysticial