当使用了移动语义之后,我们首先通过默认构造函数创建了对象obj2,然后通过std::move直接将obj2转换为右值传递给vector,将obj2的所有权转移给vector中的新元素,从运行结果也可以看出由于std::vector本身的实现机制,在所有权转移过程中调用了两次移动构造函数,但是均不会涉及内存开辟、资源复制等操作,提高了代码效率。 std...
比如一个std::vector,在返回时如果不用std::move,会进行一次拷贝,代价非常高。但用std::move可以避...
push_back(std::move(obj6)); // 调用拷贝+移动构造函数 for (auto &obj : vec) { obj.PrintData(); } return 0; } 编译后运行结果如下: 由上可知:首先,我们定义一个std::vector<MyClass>对象,并准备向其中push新元素。 传统做法是不使用移动语义的,这样会先调用默认构造函数创建新对象obj1,再通过...
std::string str2(std::move(str)); 这个时候,对str对象调用std::move,强转出来的类型将会是const string&&, 这样移动构造函数就不会起作用了,但是这个类型却可以令复制构造函数生效。 结合本文最初的问题,在lambda中move没有生效,显然也是std::move强转的类型不是std::vector<int>&&, 才导致了没有move成功。
使用std::move()的例子 让我们来看一个使用std::move()的例子: 代码语言:cpp 复制 #include<iostream>#include<vector>intmain(){std::vector<int>v1={1,2,3,4,5};std::vector<int>v2;v2=std::move(v1);std::cout<<"v1 size: "<<v1.size()<<std::endl;std::cout<<"v2 size: "<<v...
这个时候,对 str 对象调用std::move,强转出来的类型将会是const string&&, 这样移动构造函数就不会起作用了,但是这个类型却可以令复制构造函数生效。 结合本文最初的问题,在 lambda 中 move 没有生效,显然也是 std::move 强转的类型不是std::vector<int>&&, 才导致了没有 move 成功。
比较经典的场景是std::vector 扩缩容。当vector由于push_back、insert、reserve、resize 等函数导致内存重分配时,如果我们自定义的元素提供了一个noexcept的移动构造函数,vector会调用该移动构造函数将元素移动到新的内存区域;否则,则会调用拷贝构造函数,将元素复制过去。
运行结果 说明1、使用std::move操作vector元素时,原vector元素将不再可用,但原vector可以正常遍历。因为std::move操作的是元素中的具体成员,而...
使用std::move()的例子 让我们来看一个使用std::move()的例子: #include <iostream> #include <vector> int main() { std::vector<int> v1 = {1, 2, 3, 4, 5}; std::vector<int> v2; v2 = std::move(v1); std::cout << "v1 size: " << v1.size() << std::endl; ...
ProcessValue(a);// std::move函数可以以非常简单的方式将左值引用转换为右值引用ProcessValue(std::move(a));return0; }inttest_move3(){std::stringfoo ="foo-string";std::stringbar ="bar-string";std::vector<std::string> myvector;// The first call to myvector.push_back copies the value of...