[英]Copy Elision in visual 2019
我試圖測試一個小代碼來檢查我的編譯器(在 Visual Studio 2019 下)是否確實復制省略,因為在 C++17 下的某些情況下它不再是可選的。
所以我嘗試了下面的代碼:
#include <iostream>
#include <vector>
using namespace std;
struct myStruct
{
myStruct() { cout << "default ctor" << endl; }
myStruct(const myStruct& str) { cout << "copy ctor" << endl; }
myStruct& operator=(myStruct other) { cout << "Copy assignement" << endl; return *this; }
myStruct(myStruct&& str) noexcept { cout << "move ctor" << endl; }
myStruct& operator=(myStruct&& other) { cout << "move assignement" << endl; return *this; }
~myStruct() { cout << "deleted" << endl; }
};
myStruct get()
{
myStruct s;
return s;
}
int main()
{
vector<myStruct> vect;
vect.reserve(10);
cout << "Creating The Vector" << endl;
vect.push_back(get());
vect.push_back(get());
cout << "Cretion End" << endl;
return 0;
}
因此,據我所知,調用函數 get() 將觸發 RVO,因此我只會得到 ctor 調用。 但是當我運行程序時,我得到(我在調用 get() 函數后在與復制相關的行前添加了 <<<< ):
Creating The Vector
default ctor
move ctor
deleted
move ctor <<<<
deleted <<<<
default ctor
move ctor
deleted
move ctor <<<<
deleted <<<<
Cretion End
deleted
deleted
嘗試使用 gcc 時,我得到:
Creating The Vector
default ctor
move ctor
deleted
default ctor
move ctor
deleted
Cretion End
deleted
deleted
所以似乎微軟仍然沒有實現復制省略,或者我的代碼有問題所以我錯過了復制省略的真正魅力?
先感謝您
在這種情況下,任何(當前存在的)C++ 版本都不需要刪除任何副本。 標准規定了幾個副本:從s
到get
的返回值對象的副本,以及從引用參數到push_back
到vector
內部對象的副本。 后一個副本不能被刪除,前一個副本的刪除根本不能保證發生。
如果您在談論 C++17 的保證省略,這僅適用於使用純右值來初始化對象(該類型)。 這在這里永遠不會發生(在傳遞給調用push_back
的臨時參數之外,但這對於任何版本的 C++ 都是正常的),所以它不適用。
這是一個簡單的測試:如果假設副本的源對象有一個變量名,則省略(如果適用)不是強制性的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.