C++高级优化,你应该多使用关键字与引用

        继我们上一篇文章,代码优化与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 的源码, 有时间的可以自己去看看。

c48f9b5c76df407f8c8bb3df364cda8c.png

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++中的单例模式。

 

 

 

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yewencc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值