• 欢迎浏览“String me = Creater\忠实的资深Linux玩家;”,请文明浏览,理性发言,有侵犯你的权益请邮件我(creater@vip.qq.com).
  • 把任何的失败都当作一次尝试,不要自卑;把所有的成功都想成是一种幸运,不要自傲。
  •    4年前 (2014-04-01)  QT 评论关闭  14 
    文章评分 0 次,平均分 0.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()。

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

     

    除特别注明外,本站所有文章均为String me = "Creater\忠实的资深Linux玩家";原创,转载请注明出处来自http://unix8.net/home.php/3201.html

    关于
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享