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