._data)
? ? {
? ? ? ? // 将that对象原本指向该资源的指针设为空值
? ? ? ? that._data = nullptr;
? ? ? ? that._length = 0;
? ? }
? ??
? ? // 移动赋值运算符(实现移动语义:释放this + 移动that)
? ? MemoryBlock& operator=(MemoryBlock&& that)
? ? {
? ? ? ? if (this != &that)
? ? ? ? {
? ? ? ? ? ? // 释放自身的资源
? ? ? ? ? ? delete[] _data;
? ? ? ? ? ??
? ? ? ? ? ? // 将自身的资源指针指向that对象所拥有的资源
? ? ? ? ? ? _data = that._data;
? ? ? ? ? ? _length = that._length;
? ? ? ? ? ??
? ? ? ? ? ? // 将that对象原本指向该资源的指针设为空值
? ? ? ? ? ? that._data = nullptr;
? ? ? ? ? ? that._length = 0;
? ? ? ? }
? ? ? ? return *this;
? ? }
private:
? ? size_t _length; // 资源的长度
? ? int* _data; // 指向资源的指针,代表资源本身
};
?
MemoryBlock f() { return MemoryBlock(50); }
复制代码
执行下面的代码
?
复制代码
const long long max = 100000;
? ? time_t timestamp1;
? ? time_t timestamp2;
? ? time_t timestamp3;
?
? ? time(×tamp1);
? ? for (long long i = 0; i
? ? {
? ? ? ? MemoryBlock a = MemoryBlock(50);
?
? ? ? ? MemoryBlock c = std::move(a);
? ? }
? ??
? ? time(×tamp2);
timestamp3 = timestamp2 - timestamp1;
复制代码
如果把MemoryBlock c = std::move(a)换成MemoryBlock c = a;
?
性能上大概也有30%的差距。
?
?
?
这就是右值引用和移动构造语义带来的好处,我理解就是以前只能引用左值,而右值是不能引用的,新语法的加入实现了右值的引用,减少了零时对象的产生销毁,但是也带来了更多怪异的语法,明显增加了c++的学习成本,如果语法设计角度,像oc一样增加类似引用计数器来管理对象,会不会更加优雅一下,至少让上层的码农不会那么累,其实通智能指针也能达到同样的效果。
?
?
?
这么多年了c++都在做加法,让学习,使用成本太高了,标准委员为的大爷些什么时候考虑一下做点减法呢,不要让c++那么学院派或者满地都是陷阱,也不要让实现一种技术有10种方法,但是有5种都是陷阱。靠!