[英]C++ Is Object creation optimized out?
如果我有一個包含兩個構造函數的類:
class Test {
public:
Test(int x) {
_num = x;
}
Test() {
_num = 0;
}
private:
int _num;
};
我想根據這樣的條件創建一個堆棧對象:
Test test;
if (someCondition() == 23) {
test = Test(42);
}
在這種情況下,我是否會產生兩次創建 Test 對象並調用兩個構造函數的開銷? 或者這會在總體上得到優化嗎? 這被認為是好的做法嗎?
編譯器資源管理器中的玩具示例通過內聯進行了大量優化,沒有留下明顯的構造函數調用。 所以我不是很清楚。
編寫代碼來表達意圖。
您不想兩次調用構造函數。 不要兩次調用構造函數:
Test test = (someCondition() == 23) ? Test() : Test(42);
編譯器可以優化您的代碼以僅構造一個Test
嗎?
是的。 編譯器優化必須遵循所謂的“as-if rule” 。 簡而言之:在您的代碼中創建兩個、一個、一個或一個或 100 個實例都沒有明顯的效果。 編譯器可以注意到這一點並生成一個沒有創建實例的程序。
編譯器會優化您的代碼以僅構造一個Test
嗎?
除非您嘗試(或者您是編譯器編寫者並且您的大腦能夠完成編譯器的工作……然后您無需嘗試就可以知道),否則您無法分辨。 這就是為什么編寫代碼來表達意圖很重要。 你寫的代碼不是給CPU的指令,而是讓編譯器生成給CPU的指令的指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.