隐含共享处理方式

2014年4月1日 由 Creater 留言 »

使用如下的例子,来看

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()。

参考文献:《C++ GUI Qt 4编程》第11章

广告位

评论已关闭.