2020年5月16日

[C++] Mandatory Copy Elision in C++17

一言以蔽之:以前 compiler 幫你做的最佳化現在直接在標準裡規定一定要有。
簡單看個例子吧
class MyClass {
    MyClass() {}
    MyClass(const MyClass&) = delete;
};

MyClass c = MyClass{}; // Will use copy constructor before C++17 (no optimization) -> compile error
                       // Omit copy operation is guaranteed in C++17
好的,差別就是這麼簡單,不過在有 user-defined copy constructor 的情況下,這種最佳化有可能會改變程式行為就是 (原本你以為會呼叫 copy constructor 結果被最佳化掉了),但是會在標準定義這點應該還是為了效能考量,畢竟明確的少了一次非必要的 copy/move operation。

再來是已知會有 copy elision,下一個問題是何時會用到? 簡單來說就是當你用一個暫時性的物件 (像上面的例子,或是 function 的 return value 這種) 要去對另一個新的物件做初始化時 (上面的例子就是 c),這時就會有 copy elision。

其他的細節討論這邊就不多提了

沒有留言:

張貼留言