隐含共享 与 处理它的方法

28 篇文章 0 订阅

首先我们举个简单的例子讲述隐含共享,看看他的神秘面纱下的工作:

String s1="Hello !";

String s2=s1;

在这个例子中我们的初衷是将s2也赋值成="Hello !",但是计算机为了处理更快就采用了隐含共享,并没有先开辟区域再复制"Hello !",而是直接让s2指向的是s1的数据结构。

s2[0]='h';

这个时候由于我们对s2进行修改,就会发生深层复制。目的是确保s2没有再指向s1,修改是在对新的一片数据结构进行的。

 

在QT编程时对 所有的容器 和 QString QByteArray QBrush QFont QImage QPixmap对象 ,使用函数返回赋值,作为函数参数赋值等都是采用的这种高效的传递方式。

但是当不需要修改值的时候,可能由于你的使用不当还是会发生深层的复制。怎么让他不发生深层的复制而影响效率呢?

例如:

vector<QString> abc;

vector<QString> newabc=abc;

newabc现在是通过隐含共享进行的高速传递:

1.newabc[n] 这种形式出现后,Qt是不能辨别是在左边还是右边 会直接进行深层复制。

      (1) 应该使用newabc.at(n);

       (2)或把vector 声明声明为const型,它就不会把这种形式认为是在修改值了。

2.如果使用了begin()或end(),会进行深层复制。

        (1)使用constBegin()或constEnd() const_iterator代替。

        (2)或把vector 声明声明为const型,它就不会把这种形式认为是在修改值了。

        (3)使用foreach是可以代替使用begin()或end()。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值