簡體   English   中英

C++ 是否優化了對象創建?

[英]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.

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