2012-03-16 81 views
8

如果指針是nullptr,那麼運算符delete會檢查自身。調用nullptr上的delete時沒有檢查它,是否有任何性能開銷?刪除nullptr - 性能開銷?

delete ptr; 

if (ptr != nullptr) delete ptr; 

了上述執行,如果快PTR是nullptr的?

+7

後者是多餘的,所以除了潛在的速度差異外,情況更糟。 – ildjarn 2012-03-16 17:09:51

回答

18

像往常一樣,它取決於編譯器。

我使用MSVC,它將這兩行編譯爲完全相同的代碼。

規則說如果指針爲空,則刪除不起作用。所以,如果你沒有檢查,編譯器無論如何。

2

這絕對是過度優化的情況。在任何現代處理器上,差別只有幾個納秒。

通過檢查,該代碼避免了調用(刪除庫例程)的開銷。在99%的情況下,源代碼的稍微額外的複雜性(大括號,潛在的錯字!=等)比額外的執行時間更具問題。

+0

由於不允許編譯器調用析構函數,因此如果指針爲null,則該檢查必須在生成的代碼中調用庫':: operator delete()'之前。 – 2012-03-16 17:32:32

2

不,沒有任何開銷,當你不檢查ptrnullptr

如果您手動進行檢查,則會執行兩次相同的檢查,儘管這與系統調用的成本相比可以忽略不計,但如果ptr不爲空,則可以預期。

+3

另外,如果你已經使用C++ 11,也許考慮不使用刪除,而是使用智能指針? – 2012-03-16 17:10:53

+1

C++ 11沒有必要 - Boost多年來一直有很好的智能指針。 : - ] – ildjarn 2012-03-16 17:15:00

+0

當然!但是,當他們躺在你的手下時,你沒有更多的藉口在大多數標準情況下不使用它們:) – 2012-03-16 17:16:24

2

如果ptr是nullptr,上述哪一項執行得更快?

假設您的支票沒有被優化掉,最上面的那個會更快。如果它確實得到優化,則速度也不會更快。 將其留給編譯器。