C++ Move Semantics
文章平均质量分 55
学习一下移动语意
剑决浮云气
事了拂衣去,深藏功与名
展开
-
Chapter 4 How to Benefit from Move Semantics
1. Avoid Objects with Names①如果编译器检测到一个值 来自于一个生命周期即将结束的对象,那么他便会自动的去选择移动语意传递临时对象返回一个局部变量 return local object by value②除此之外我们还可以显示标记一个对象 std::move()尽量避免给对象命名MyType x{42, "hello"};foo(x); // x not used afterwards这个x对象,以后就没有使用过了,那么我们就可以用另一种方式代替foo(MyT原创 2022-01-21 10:45:40 · 148 阅读 · 0 评论 -
Chapter3 Move Semantics in Classes
1. Move Semantics in Ordinary Classes①C++11之后,编译器会为简单的类生成 移动构造函数 和 移动赋值运算符(就像生成的默认构造函数和默认赋值运算符)②什么时候会使用移动构造当返回一个局部变量(return local obj by value)按值传递一个无名对象传递一个临时对象(例如 函数的返回值)被std::move 标记的对象③测试代码一个简单的类 只有构造函数和一个重载的运算符class Test{public: Tes原创 2022-01-20 10:14:31 · 121 阅读 · 0 评论 -
2.5 Passing by Value 2.6 Summary
1.Passing by Value函数形参的声明 是pass by valuevoid foo(std::string str); // takes the object by valuestd::string s{"hello"};...foo(s); // calls foo(), str becomes a copy of sfoo(std::move(s)); // calls foo(), s is moved to strfoo(returnStringByValue())原创 2022-01-17 11:19:52 · 107 阅读 · 0 评论 -
2.4 Overloading by Different References
1.Overloading by Different References在我们了解完右值引用之后,我们有三种形参可以pass by referencevoid foo(const std::string& arg)void foo(std::string& arg)void foo(std::string&& arg)2. void foo(const std::string& arg)①形参表示 你对传过来的实参 只具有读的权限②将实参作为 c原创 2022-01-17 10:07:18 · 91 阅读 · 0 评论 -
2.3 Moved-from Objects
1.Moved-from Objects在一个对象被std::move()以后,仍然是有效的一个对象,在其生命周期结束的时候会调用其析构函数。只不过该对象的值变得不确定了。2.Valid but Unspecified StateC++的标准库保证move以后,仍然是有效的对象,但却不能保证他的valuestd::string s;...coll.push_back(std::move(s));foo(std::move(s)); // keeps s in a valid but unc原创 2022-01-14 11:22:52 · 173 阅读 · 0 评论 -
2.2 std::move()
1. std::move()①我们都知道 对象都有生命周期,当生命周期结束的时候,对象会被销毁释放②我们可以在一个对象生命周期没有结束的时候,我们可以对一个对象使用move标记,来表示 我不在需要这个对象了,仅使用std::move()并没有真的被move,只是作为一个标记void foo(const std::string& lr); // binds to the passed object without modifying itvoid foo(std::string&&原创 2022-01-14 09:57:42 · 345 阅读 · 0 评论 -
2.1 Rvalue References
1. Rvalue Referencesstd::string returnStringByValue(); // forward declaration...std::string s{"hello"};...std::string&& r1{std::move(s)}; // OKstd::string&& r2{returnStringByValue()}; // OK, extends lifetime of return valuestd::st原创 2022-01-14 09:31:17 · 116 阅读 · 0 评论 -
1.5 Summary
1.总结①移动语意 可以使我们呢优化数据的拷贝,可以隐式的使用(return by value或者是 右值传参) 或者直接显式 std::move()②std::move()仅仅是代表一个对象是可移动的,该对象仍然存在,但是他的值不确定了,具体看编译器的实现③通过使用 non-const && 作为形参,调用者可以将它不在需要的对象传递进来,此函数将在内部对实参进行任何需要的修改④当没有实现移动语意的时候,你仍然可以使用std::move,因为当编译器找不到移动语意的时候,他便会使原创 2022-01-13 20:51:55 · 98 阅读 · 0 评论 -
1.4Move Semantics for const Objects
1.Move Semantics for const Objects被const修饰的对象 不能被movemove就是要修改传入的值,去"偷"2.类的定义class MyString{public: MyString(int Len = 0, const char* Str = nullptr) : nLen{ Len } { cout << "默认构造函数" << endl; pStr = new char[原创 2022-01-13 20:43:49 · 91 阅读 · 0 评论 -
1.2 Implementing Move Semantics
1. Implementing Move Semantics①C++11 以前的push_back()的实现 只有一种template<typename T>class vector {public:...// insert a copy of elem:void push_back (const T& elem);...};也就是说,你只能为该函数传入一个左值②C++11 之后 有了一个重载版本template<typename T>class原创 2022-01-13 20:25:25 · 94 阅读 · 0 评论 -
1.1后续 Motivation for Move Semantics
1.节约资源通过上一次讲解,我们发现程序做了很多无意义的拷贝,如果能直接将那些要销毁的元素直接给新的元素,那不省去了很多事情吗?没错C++11的移动语义,就是干这个事情的2.C++11①createAndInsert(); 函数#include <string>#include <vector>std::vector<std::string> createAndInsert(){std::vector<std::string> coll;原创 2022-01-13 11:30:16 · 96 阅读 · 0 评论 -
1.1 Motivation for Move Semantics
1. Motivation for Move Semantics为什么我们需要移动语义呢?节约资源就是这四个字 节约资源2.C++03①函数 createAndInsert();#include <string>#include <vector>std::vector<std::string> createAndInsert(){std::vector<std::string> coll; // 创建了一个元素是string的vector原创 2022-01-13 10:32:09 · 120 阅读 · 0 评论