簡體   English   中英

移動std :: vector成員的語義

[英]Move Semantics for std::vector member

我想確保我正確理解這一點。 我在這里問它,因為我沒有明確說明它的資金。

例如,我有一個三角形網格類,基本上是這樣構建的:

class Mesh
{
public:
    struct Face 
    {
        unsigned int a;
        unsigned int b;
        unsigned int c;
    };
//... 
private:
    std::string            file;
    std::vector<glm::vec3> vertices;
    std::vector<glm::vec3> normals;
    std::vector<glm::vec2> texcoord;
    std::vector<Face>      faces;   
}

由於網格中的數據可能變得非常大,我想實現適當的移動語義。 對於指針類型我完全理解這一點,但要觸發rvalue構造函數我需要使用move,對吧?

例如,rvalue構造函數將是:

Mesh::Mesh(Mesh&& other)
: file(std::move(other.file)),
  vertices(std::move(other.vertices)),
  normals(std::move(other.normals)),
  texcoord(std::move(other.texcoord)),
  faces(std::move(other.faces) {}

注意:在有人指出明顯的情況之前,應用程序在很多地方使用share_ptr。 但我不想人為地限制班級的使用。

是的,你必須在移動構造函數中使用std::move() ,就像你一樣。 但是,您的移動構造函數完全復制了默認構造函數。 如果您的班級沒有定義任何:

  • 復制構造函數
  • 復制賦值運算符
  • 移動賦值運算符
  • 析構函數

然后將為您生成一個默認的移動構造函數,完全按照您的方式執行。 你最好省略定義並依賴默認定義。

即使你的類定義了上面的一些,你也可以要求編譯器生成默認的移動構造函數:

class Mesh
{
public:
  Mesh(Mesh &&) = default;
  // the rest as before
};

這樣,你就不必定義它,即使你以后添加其他成員它也會工作(沒有忘記將它們添加到手動移動構造函數的風險)。


不幸的是,上述兩種情況都不適用於Visual Studio 2015或更早版本,它們無法生成默認的移動構造函數,也不支持移動操作的= default 因此,如果您的目標是VS <= 2015,則必須手動拼出移動構造函數 - 就像您一樣。

暫無
暫無

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

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