首先我们举个简单的例子讲述隐含共享,看看他的神秘面纱下的工作:
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()。