继我们上一篇文章,代码优化与BUG解决!!我谈到了很多关键字的使用与代码优化方法。所有如果你有需要的话可以借鉴!
在这篇文章我们来谈谈剩下的一些C++11的新特性,也算是比较重要的一点的,使用次数很多的特性。
8. std::move move操作: 对于我来说",是我使用C++11新特性中最为神奇的一种操作,感觉有点像我们电脑上常用剪切功能,这算是最为形象的一种表达,使用起来好像也确实如此!move操作的背后:干掉原内存空间,覆盖新内存空间。” 不信的话, 可以用下面这段代码证明一下:
std::vector<int> source = { 1, 2, 3, 4, 5 };
std::vector<int> destination = std::move(source);
// std::vector<int> destination = source;
if (source.empty())
{
cout << "empty ";
}
for (int i = 0; i < source.size(); i++)
{
cout << source[i] << " ";
}
cout << endl;
for (int i = 0; i < destination.size(); i++)
{
cout << destination[i] << " ";
}
注意:move操作之后,原对象就访问不到数据了,因为ta搬家了。拖家带口连指针带数据,全搬到了新空间里,所以访问不到;搬家之后清空了这块地址与内存空间,可以重新使用,所以一切都如我们想的那样! move操作真的在搬家。正如标准会给ta起的名字一样 std::move 移动! 尝试一下,move操作背后所带来的高效与效率性吧!
move操作的背后,是一大段的长篇大论!一直未被公开过。究竟是因为不安全吗? 还是风险太高了 。 算了,反正我现在都知道了!!所以这是一段被C++标准会雪藏了多年的std::move.
一段官方解释:我是懒得看这些长篇大论。希望我能用最简单的话,解释清楚了。
std::move是c++标准库中的一个实用函数,用于将对象的所有权从一个位置转移到另一个位置。它是c++ 11中引入的move语义特性的一部分。
当一个对象被移动时,它的资源(比如动态分配的内存)会从源对象转移到目标对象,而不做任何拷贝。这比复制更有效,特别是对于大型对象。
move函数通常与move构造函数或move赋值操作符一起使用。它用于指示被移动的对象应被视为右值,从而允许调用move构造函数或move赋值操作符,而不是调用复制构造函数或复制赋值操作符。
9. 智能指针 shared_ptr, unique_ptr,weak_ptr 一次性 把这三个全说了! 不要觉得ta有多难,直接用就是了。一旦,觉得难,就会有阻力。什么这那的各种操作,没那么多事。大胆用就行了。
shared_ptr ta不是线程安全的,shared_ptr只是保证了ta这个指针安全,并不保证数据。shared_ptr本身也是个指针,只不过用类方法包装了起来,里面包括了“引用计数规则,初始化创建,释放等等”。大概就是这些。
unique_ptr 只是独占,所以就只能单独使用了,不允许相互赋值, 其实就是把拷贝构造函数 删掉了。实现了独占的方式。下面是ta 的源码, 有时间的可以自己去看看。
weak_ptr :不会引起引用计数的增加! 看下官方解释吧!
weak_ptr是C++中的智能指针,用于解决循环引用的问题。它是shared_ptr的一种扩展,可以解决shared_ptr可能导致的内存泄漏问题。
weak_ptr可以从一个shared_ptr或另一个weak_ptr对象构造,它不会改变引用计数的值,也不会对所指向的对象产生拥有权。当原始的shared_ptr对象被销毁后,weak_ptr就变为空指针。
使用weak_ptr时,需要通过lock()函数获取一个shared_ptr对象来访问原始对象,如果原始对象已经被销毁,则lock()函数将返回一个空shared_ptr对象。
weak_ptr可以用于解决循环引用的问题,当两个对象相互引用时,如果使用shared_ptr来管理引用,会导致引用计数无法归零,从而导致内存泄漏。而使用weak_ptr来管理其中一个对象的引用,可以打破循环引用链,确保对象的正确销毁。
总之,weak_ptr是一种解决循环引用问题的智能指针,可以安全地引用shared_ptr对象,避免内存泄漏的问题。
值得注意的是 我应该怎么使用的这三个指针? 如果你不想管理指针内存释放问题,那就用unique_ptr 吧! 因为ta性能更好一点,没引用计数这些规则。如果你想 来回共享对象 那就用
shared_ptr。
10, const 学会使用const 使你的代码事半功倍!!const 你的函数, 变量,类 等等。一切看起来不会改变的地方。
11, & 高级优化 学会使用引用!
int data[5] = { 1,2,3,4,5};
for (const auto& v : data)
{
cout << v<<" ";
}
12, 学会分析你的代码,哪里多了无用的复制,哪里浪费了时间!哪里牺牲了性能!等等。
13. 漏掉了一个关键字 static(静态修饰符),一个一直被使用,却从没未被提起的关键字。值得注意的是C++Primer第五版这本书里也不介绍静态,直接就用了。waht? 好像发现了重大BUG! 是太过于经典了,让人把ta给忘了? static 静态的生命周期: 存在于整个程序的运行生命周期中,直到程序结束。static的应用场景,常见在我们的使用的单例模式中,我之前很早就写过的一篇关于C++中的单例模式。