我是一个简单的程序员。 我的类成员variables通常由PODtypes和STL容器组成。 正因为如此,我很less必须编写赋值操作符或复制构造函数,因为这些都是默认实现的。 std::move ,如果我使用std::move不可移动的对象,它会使用赋值运算符,这意味着std::move是完全安全的。 因为我是一个简单的程序员,所以我想利用移动function,而不必为我编写的每个类添加移动构造器/赋值运算符,因为编译器可以简单地将它们实现为“ this->member1_ = std::move(other.member1_);… “ 但它不(至less在Visual 2010中),是否有任何特别的原因呢? 更重要的是; 有什么办法可以解决这个问题吗? 更新:如果你看低于GManNickG的答案,他提供了一个伟大的macros。 如果你不知道,如果你实现移动语义,你可以删除交换成员函数。
在这种情况下 struct Foo {}; Foo meh() { return std::move(Foo()); } 我很确定这个举动是不必要的,因为新创build的Foo将是一个xvalue。 但是在这种情况下呢? struct Foo {}; Foo meh() { Foo foo; //do something, but knowing that foo can safely be disposed of //but does the compiler necessarily know it? //we may have references/pointers to foo. how could the compiler know? return std::move(foo); //so here the move […]
有时声称,即使仅仅编译C ++ 98代码,C ++ 11/14也可以提高性能。 理由通常是沿着移动语义的线,因为在某些情况下,右值构造函数是自动生成的或现在是STL的一部分。 现在我想知道这些情况以前是否已经由RVO或类似的编译器优化处理过。 我的问题是,如果你能给我一个C ++ 98代码的实例,不加修改,使用支持新语言function的编译器运行得更快。 我明白一个标准的编译器不需要做copy copy,因此移动语义可能会带来速度,但是如果你愿意的话,我希望看到一个较less的病态的情况。 编辑:只是要清楚,我不问新的编译器是否比旧的编译器更快,而是如果有代码,将-std = c ++ 14添加到我的编译器标志将会运行得更快(避免副本,但如果你除了移动语义之外还能想出其他的东西,我也会感兴趣的)
C ++ 11标准对于标准库的自动分配有什么意义? 更具体一些,如果有的话,什么是selfAssign保证什么? template<class T> std::vector<T> selfAssign(std::vector<T> v) { v = std::move(v); return v; }
可能重复: 有人可以解释移动语义给我吗? 我最近参加了一个C ++ 11研讨会,并给出了以下的build议。 when you have && and you are unsure, you will almost always use std::move 任何人可以向我解释为什么你应该使用std::move ,而不是一些替代品和一些情况下,当你不应该使用std::move ?
我看到代码在某个地方有人决定复制一个对象,然后把它移动到一个类的数据成员。 这使我感到困惑,因为我认为整个移动的目的是避免复制。 这是一个例子: struct S { S(std::string str) : data(std::move(str)) {} }; 这是我的问题: 为什么我们不采取右值参考str ? 不会有一个副本是昂贵的,尤其是给一些像std::string ? 那么作者决定做一个副本然后呢是什么呢? 我应该什么时候自己做这个?
什么是重用移动的容器的正确方法? std::vector<int> container; container.push_back(1); auto container2 = std::move(container); // ver1: Do nothing //container2.clear(); // ver2: "Reset" container = std::vector<int>() // ver3: Reinitialize container.push_back(2); assert(container.size() == 1 && container.front() == 2); 从我在C ++ 0x标准草案中读到的内容; ver3似乎是正确的方法,因为移动后的对象在 “除非另有规定,否则此类移动物体应置于有效但未指明的状态。” 我从来没有发现任何情况下,“否则指定”。 虽然我发现ver3有点迂回,会有很多首选的ver1,尽pipevec3可以允许一些额外的优化,但另一方面可能容易导致错误。 我的假设是否正确?
在C ++ 98中,C ++编译器可以自动生成拷贝构造函数和拷贝赋值操作符,例如通过成员拷贝 struct X { std::string s; std::vector<int> v; int n; }; 编译器自动生成X拷贝构造函数和拷贝赋值操作符,使用成员级拷贝。 但是,在移动语义的情况下,C ++ 11中的事情是如何改变的? 移动 构造函数和移动 赋值运算符是否 自动生成,如复制构造函数和复制赋值运算符? 有没有移动操作不会自动生成的情况?
说我有两个向量,我移动到另一个, v1 = std::move(v2) ; v2还会在这之后处于可用状态吗?
如果我想执行只读操作, const auto&就足够了。 但是,我碰到了 for (auto&& e : v) // v is non-const 最近几次。 这让我想知道: 是否有可能在一些不起眼的angular落案例中使用通用引用有一些性能优势,与auto& or const auto&相比? ( shared_ptr是一个晦涩的angular落案件的嫌疑犯) 更新我在我的collections中find的两个例子: 迭代基本types时使用const引用的任何缺点? 我可以使用基于范围的for循环轻松地迭代地图的值吗? 请专注于这个问题: 为什么我要在基于范围的for循环中使用auto &&?