隐性数据的共享
来源:互联网 发布:无线鼠标 辐射 知乎 编辑:程序博客网 时间:2024/04/27 15:14
Qt 中许多 C++ 类使用了隐式数据共享技术,来最大化资源利用率和最小化拷贝时的资源消耗。当作为参数传递时,具有隐式数据共享的类即安全又高效。在数据传递时,实际上只是传递了数据的指针(这一切都是隐含帮你完成的),而只有在函数发生需要写入的情况时,数据才会被拷贝(也就是通常所说的写时复制)。本章我们将介绍有关隐式数据共享的相关内容,以便为恰当地使用前面所介绍的容器夯实基础。
具有数据共享能力的类包含了一个指向共享数据块的指针。这个数据块包含了数据本身以及数据的引用计数。当共享对象创建出来时,引用计数被设置为 1。当新的对象引用到共享数据时,引用计数增加;当对象引用不再引用数据时,引用计数减少。当引用计数变为 0 时,共享数据被删除。
在我们操作共享数据时,实际有两种拷贝对象的方法:我们通常称其为深拷贝和浅拷贝。深拷贝意味着要重新构造一个全新的对象;浅拷贝则仅仅复制引用,也就是上面所说的那个指向共享数据块的指针。深拷贝对内存和 CPU 资源都是很昂贵的;浅拷贝则非常快速,因为它仅仅是设置一个新的指针,然后将引用计数加 1。具有隐式数据共享的对象,其赋值运算符使用的是浅拷贝来实现的。
这种隐式数据共享的好处是,程序不需要拥有不必要的重复数据,减少数据拷贝的需求。重复数据的代价是降低内存使用率(因为内存存储了更多重复的数据)。通过数据共享,对象可以更简单地作为值来传递以及从函数中返回。
隐式数据共享是在底层自动完成的,程序人员无需关心。这也是“隐式”一词的含义。从 Qt4 开始,即使在多线程程序中,隐式数据共享也是起作用的。在很多人看来,隐式数据共享和多线程是不兼容的,这是由引用计数的实现方式决定的。但是,Qt 使用了原子性的引用计数来避免多线程环境下可能出现的执行顺序打断的行为。需要注意的是,原子引用计数并不能保证线程安全,还是需要恰当的锁机制。这种观点对所有类似的场合都是适用的。原子引用计数能够保证的是,线程肯定操作自己的数据,线程自己的数据是安全的。总的来说,从 Qt4 开始,你可以放心使用隐式数据共享的类,即使在多线程环境下。
我们可以使用QSharedData
和QSharedDataPointer
类实现自己的隐式数据共享类。
当对象即将被修改,并且其引用计数大于 1 时,隐式数据共享自动将数据从共享块中拿出。隐式共享类必须控制其内部数据,在任何修改其数据的函数中,将数据自动取出。
- 隐性数据的共享
- 揭秘大数据分析的隐性价值
- 项目中隐性知识共享的实施步骤
- 非正式组织中影响隐性知识共享的因素分析
- 隐性反馈行为数据的协同过滤推荐算法
- 隐性知识的学习
- Oracle数据类型的隐性转换
- U3D-隐性的局部变量
- 软件许可证的隐性成本
- Android 隐性Intent的例子
- 探索Kotlin的隐性成本
- 数据共享的方法
- 共享数据的保护
- 线程的数据共享和不共享
- mysql中事物的隐性的提交
- 再论信息化的隐性成本
- 再论信息化的隐性成本
- 再论信息化的隐性成本
- Spring AOP实现
- shell脚本循环读取参数,文件批量重命名
- 输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针
- CC3200学习——blinky资料
- 分析函数窗口子句 RANGE/ROWS 差别
- 隐性数据的共享
- 设计模式_组合模式(14)
- java通过FTP获取不到文件
- [LeetCode]习题4
- linux下.desktop桌面程序图标文件编写
- Emgu在WPF中的使用
- 告别乱码,针对GBK、UTF-8两种编码的智能URL解码器的java实现
- NSSortDescriptor和NSPredicate的使用总结
- h2数据库出现异常处理方案