隐式共享: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中的很多C++类都使用了隐式数据共享来最大化资源使用和最小化拷贝代价。隐式共享类在作为参数传递时,不仅安全而且高效,因为只是指向数据的指针被传递了,底层的数据只有在函数向它执行写动作时才会发生拷贝...
  • Amnes1a
  • Amnes1a
  • 2017年04月10日 13:43
  • 615

Qt学习:理解隐式共享

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

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

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

Qt程序中动态库的隐式调用

这几天在写程序中时候,用到了一个第三方库。我下载完他的源码编译后,不怎么怎么使用, 后来在网上找了找了一些资料查看了一些文档。终于解决了问题! 动态库和静态库的介绍在在前的博客:http://bl...
  • Andy_93
  • Andy_93
  • 2016年10月20日 14:43
  • 899

Qt中的"隐式共享"

一个共享类对象创建,它的引用计数就记为1,如果将它传递给另一个对象,那计数就加1,并两个对象都指向内存中的相同的内部数据结构。如果某一个修改了对象值就会发生深度复制,以确保他们指向的数据结构不相同。并...
  • gjtboa
  • gjtboa
  • 2015年12月07日 16:22
  • 395

Qt中隐式调用VS建立的dll动态库

Dll文件调用方式分为显式调用和隐式调用,在这里选择隐式调用的方式。 准备dll文件: 这里选择VS 2010作为dll的开发工具,打开vs 2010,选择文件->新建->项目 在新建项目窗...
  • fantasy999999999
  • fantasy999999999
  • 2014年11月10日 13:22
  • 1867

Qt隐式共享理解

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

15 innodB的隐式锁

一、知识准备之隐式锁 参考:http://www.uml.org.cn/sjjm/201205302.asp Innodb 实现了一个延迟加锁的机制,来减少加锁的数量,在代码中称为隐式锁(Impli...
  • taozhi20084525
  • taozhi20084525
  • 2014年02月20日 11:11
  • 1315

Qt调用qt生成的dll 显式和隐式(静态动态)

昨天突然想到 :接触了这么久的qt了  dll(动态链接库)还没有用过就打算事件一下  差了半天资料 感觉网上没有一片文章讲述的全面详细,于是就有个这篇博客。 环境:win7+qt5.3.2 开始...
  • xiaobai_2511
  • xiaobai_2511
  • 2016年05月27日 17:01
  • 984

python中隐式的内存共享

python中如何消除list的内存共享
  • kellyseeme
  • kellyseeme
  • 2016年04月10日 14:45
  • 489
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:隐式共享:qt
举报原因:
原因补充:

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