簡體   English   中英

在視覺 2019 中復制 Elision

[英]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++ 版本都不需要刪除任何副本。 標准規定了幾個副本:從sget的返回值對象的副本,以及從引用參數到push_backvector內部對象的副本。 后一個副本不能被刪除,前一個副本的刪除根本不能保證發生。

如果您在談論 C++17 的保證省略,這僅適用於使用純右值來初始化對象(該類型)。 這在這里永遠不會發生(在傳遞給調用push_back的臨時參數之外,但這對於任何版本的 C++ 都是正常的),所以它不適用。

這是一個簡單的測試:如果假設副本的源對象有一個變量名,則省略(如果適用)不是強制性的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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