我發現,這個樣板代碼頻繁出現在我的程序:棘手空檢查和調用
if (ptr) {
ptr->method();
}
,我已經用單內襯替代它(就像我看到人們這樣做在Java
) :
ptr && (ptr->method(), true);
這是從生成的機器代碼的角度來看一個很好的做法還是我引入額外的常量到我的二進制?在我的程序中可能導致Java
這個「端口」有什麼問題?
我發現,這個樣板代碼頻繁出現在我的程序:棘手空檢查和調用
if (ptr) {
ptr->method();
}
,我已經用單內襯替代它(就像我看到人們這樣做在Java
) :
ptr && (ptr->method(), true);
這是從生成的機器代碼的角度來看一個很好的做法還是我引入額外的常量到我的二進制?在我的程序中可能導致Java
這個「端口」有什麼問題?
從生成機器碼的角度來看,這是完全不相關的。如果這兩種形式中的一種更好,並且編譯器的優化器不能將一種形式轉換爲另一種形式,那麼它就不值得稱爲「優化器」。
這隻留下了哪些更易讀的問題。第一個是顯而易見的。第二個將很容易讓人分析一分鐘以上。不好。
另請注意,第二種情況可能在運營商超載的情況下引入不需要的結果。如果operator ,
對於method()
返回的類型過載,它將在第二種情況下被調用,而不是在第一種情況下。如果operator &&
對於類型ptr
過載,則第二種情況將簡單失敗,因爲過載的&&
不會被延遲評估。但是,這些運營商都是那些極度不鼓勵超載的運營商。
One-liners與'if'相比也具有優勢,因爲它們可以出現在'C++ 11'中的'constexpr'函數中。 – user1095108
生成的機器碼取決於這段代碼之前的代碼。 – user743414
@ user743414當然。但是這對於任何*代碼片段都適用。如果我們單獨分析OP的代碼段,我的答案就是。如果我們不這樣做,我們需要知道上下文來說什麼。但就UB而言,如果其中一個OP的版本具有UB,那麼它們都有。 – Angew
原件看起來更好,更具可讀性。 –
是的,但類似的代碼在'Java'中很常見,而且Java被認爲(根據某些人)比「C++」更好。 – user1095108
@ user1095108其他人不同意某些人。 –