隐式共享:qt

转载 2015年07月09日 14:19:17
之前写过一篇学习有关隐式共享的文章,那只是比较粗浅的学习,只有大致的了解,其实当时自己也不是特别懂,不知道会在哪里用到呢?后来查别的资料涉及到了隐式共享,觉得很好的,所以再次记录下来,作为学习笔记吧。
       其实,在使用Qt容器类的时候会可能用到隐式共享机制(implicit sharing),也叫做copy on write。顾名思义,就是说,在内容有变动的情况下才对容器中的数据结构做复制,否则仅做共享。比如:
  1. QList<QString> list1; 
  2. list1 << "helianthus"; 
  3. QList<QString> list2 = list1; 
  4.     
  5. cout << &list1[0] << endl; 
  6. cout << &list2[0] << endl;
在这个例子中使用了[]运算子,list1和list2中的数据结构经过了复制,所以并不是共享的。因此最后显示的两个记忆体位置并不相同,但是使用了at()时的情况是一样的:
  1. QList<QString> list1; 
  2. list1 << "x"; 
  3. QList<QString> list2 = list1; 
  4. //QList::at(int i) const:Returns the item at index position i in the list. i must be a 
  5. //valid index position in the list (i.e., 0 <= i < size())   
  6. cout << &(list1.at(0)) << endl; 
  7. cout << &(list2.at(0)) < < endl;
所以,在只读的情况下,使用at()方法要比使用[]运算子效率高,因为省去了数据结构的复制成本。
      隐式共享之所以称为copy on write,也就是说只要容器中的数据结构内容发生了变化就不再共享,而要复制。就上一个例子而言,如果对list2做了修改,比如:
  1. list2 << "linux";
那么:
  1. cout << &(list1.at(0)) << endl; 
  2. cout << &(list2.at(0)) << endl;
此时list1和list2显示的记忆体位置就是不同的。
再比如:
  1. QList<int> function() { 
  2.     QList<int> list; 
  3.     // ...blah..blah 
  4.     cout << &list << endl; 
  5.     return list; 
  6. }
然后,就可以利用这个函数实现数据共享,又不会数据结构复制:
  1. QList<int> retval= function();
  2. cout << &retval << endl;
在上面这个代码片段中,function()中的list位置和接收function中的list的retval位置是相同的。总的来说,QT中所有的容器类都支持隐式共享;此外,QByteArray,QBrush,QPen,QPalette,QBitmap,QImage,QPixmap,QCursor,QDir,QFont和QVariant等也都只是隐式共享机制。
      而无论是Java风格还是STL风格的迭代器,使用只读迭代器时,背后也都使用到了隐式共享机制,以增加读取的效率。

相关文章推荐

Qt隐式共享理解

Qt的隐式共享, 简单的说就是:赋值时不直接拷贝而是用共享指针使用同一块数据, 当其中一个被修改时,被修改的值才会拷贝一份出来修改. 如: QFont f1; QFont f2 = f1, ...

Qt框架浅析之一 ------- 隐式共享(Implicit Sharing)

嗯,也许很多人都讲过这个Qt架构这个话题,但是我还是要讲一下这个,希望能有一点新意吧。    我们先来看看Qt官方关于Qt隐式共享的解释:    Many C++ classes in Qt use ...

QT 隐式共享 Implicit Sharing

很多QT中的类都是隐式共享的,它在作为参数传递时既安全又有效率。 上一讲中提到了一个implicit sharing的问题,说QT容器类是隐式共享的。文档中讲了一个这样的问题: 一些Qt函数返回一...

Qt学习:理解隐式共享

(1)深拷贝:即就是生成对象的一个完整的复制品; (2)浅拷贝:只是一个引用复制(比如仅仅复制指向共享数据的指针)。 (3)隐式共享:也叫做回写复制(copy on write)。 ...

Qt Implicit Sharing (隐式共享)

今天翻译了以下Qt文档中关于隐式共享的叙述,在此记录下来供以后查看。由于我水平有限(英语四级依然没过),所以大家谨慎参考。如有高手请指正其中错误,谢谢 Implicit Sharing 隐式共...

Qt 隐式共享

之前写过一篇学习有关隐式共享的文章,那只是比较粗浅的学习,只有大致的了解,其实当时自己也不是特别懂,不知道会在哪里用到呢?后来查别的资料涉及到了隐式共享,觉得很好的,所以再次记录下来,作为学习笔记吧。...

Qt之美(三)隐式数据共享

为了最大化资源使用,和最小化数据拷贝,Qt在很多类中用到了隐式数据共享,以便数据仅在被写入时才被拷贝。该机制也被称为flyweight模式。让我们以QByteArray为例,看看其是如何实现的。其内部...

Qt隐式共享与显式共享

Qt中的很多C++类都使用了隐式数据共享来最大化资源使用和最小化拷贝代价。隐式共享类在作为参数传递时,不仅安全而且高效,因为只是指向数据的指针被传递了,底层的数据只有在函数向它执行写动作时才会发生拷贝...

Qt学习之路(36): Qt容器类之遍历器和隐式数据共享

前面说过,Qt容器类提供了两种遍历器:Java风格的和STL风格的。前者比较容易使用,后者则可以用在一些通过算法中,功能比较强大。   对于每一个容器类,都有与之相对应的遍历器:只读遍历器...

Qt学习之路(36): Qt容器类之遍历器和隐式数据共享

本文出自 “豆子空间” 博客,请务必保留此出处http://devbean.blog.51cto.com/448512/247353 前面说过,Qt容器类提供了两种遍历器:Java风格的和STL...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)