簡體   English   中英

構造函數會影響性能嗎?

[英]Does constructor affect performance?

我有3個成員變量聲明為public的類,我最初可以在代碼中的任何地方顯式顯示,我仍然使用初始值編寫構造函數這個構造函數會影響性能開銷嗎?

class ABC{
    public:
    int a;
    int b;
    int c;

    ABC (): a(0) , b(0), c(0) 
    {
    }
};

如果構造函數增加性能開銷,請告訴我?

初始化可能會產生很小的成本。 然而:

  1. 如果可以證明它們是不必要的,編譯器可能能夠消除初始化。

  2. 即使成本很低,也絕對有可能在整個應用程序的背景下完全無關緊要。 您可以使用分析器來量化性能效果。

  3. 它讓您確信這三個字段將始終初始化,從而消除某些類型的潛在錯誤。

是的,不是。

是的,它確實增加了一些性能開銷 ,因為你要求計算機做一些操作,而在默認情況下它不會初始化基本類型的成員。

不,它不會在實踐中增加性能開銷 ,因為操作將花費不大的時間。 此外,你需要在一段時間內仍要初始化您的域(你永遠不會與未初始化下地干活,你願意嗎?)。 因此,當您需要更改初始值時,您只需支付實際的性能開銷。 但是你可以通過定義第二個構造函數(一個帶參數的構造函數)來實現正確的初始值,並且你可能應該這樣做,這樣當你對它不感興趣時​​你就會避免默認的構造函數調用,而是調用一個離開的構造函數您的對象完全按照您的意願進行初始化。

它具有與此完全相同的性能:

int a = 0;
int b = 0;
int c = 0;

意味着性能影響完全可以忽略不計,你不應該擔心它。

它將int初始化為零,這可能是好的並且需要花費很少的時間。

對於一般問題,構造函數是否會影響性能 ,答案取決於它

  • 通常,您希望盡可能使用初始化程序列表 (否則您可能會使用默認構造函數然后進行復制分配,請參閱此問題以獲得進一步說明)。

  • 如果你提供一個非投擲移動構造函數(即noexcept(true) ),像push_back這樣的操作將使用這樣的(大概是便宜的)構造函數(否則操作將復制值,可能更昂貴)。

我相信其他人可以提出其他原因。

最后,我將重點關注這一點。 如果你確定(在適當的分析之后)你的構造函數是一個瓶頸(我非常懷疑它),那么擔心改進它們。 否則,您可能會浪費時間進行完全無關的納米優化。

注意:

我在回答這個問題時犯了兩大錯誤。 我已經從答案中刪除了它們。 請查看此評論的歷史記錄以了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM