【问题标题】:What is implicit sharing?什么是隐式共享?
【发布时间】:2011-06-05 23:52:38
【问题描述】:

我正在用 C++ 构建游戏引擎库。不久前,我正在使用 Qt 构建一个应用程序,并且对 Implicit Sharing 的使用非常着迷。我想知道是否有人可以更详细地解释这种技术,或者可以提供一个简单的例子。

【问题讨论】:

标签: c++ qt copy-on-write


【解决方案1】:

隐式共享背后的关键思想似乎使用了更常见的术语copy-on-write。写时复制背后的想法是让每个对象充当指向实际实现的指针的包装器。每个实现对象都跟踪指向它的指针的数量。每当对包装对象执行操作时,它都会被转发到执行对象,由其执行实际工作。

这种方法的优点是复制和销毁这些对象很便宜。要制作对象的副本,我们只需创建一个包装器的新实例,将其指针设置为指向实现对象,然后增加指向该对象的指针数量的计数(有时称为 顺便说一句,引用计数)。销毁类似——我们将引用计数减一,然后查看是否有其他人指向实现。如果没有,我们释放它的资源。否则,我们什么也不做,只是假设其他人稍后会进行清理。

这种方法的挑战在于它意味着多个不同的对象都将指向同一个实现。这意味着如果有人最终对实现进行了更改,那么引用该实现的每个对象都会看到这些更改——这是一个非常严重的问题。为了解决这个问题,每次执行可能会更改实现的操作时,该操作都会通过查看引用计数是否相同 1 来检查是否有任何其他对象也引用了该实现。如果没有其他对象引用该对象,则操作可以继续进行 - 更改传播的可能性不大。如果至少有一个其他对象引用该数据,则包装器首先为自己制作一个实现的深拷贝,并将其指针更改为指向新对象。现在我们知道无法进行任何共享,并且可以毫不费力地进行更改。

如果您想查看一些实际示例,请查看来自Stanford's introductory C++ programming course 的讲座示例 15.0 和 16.0。它展示了如何使用这种技术设计一个对象来保存单词列表。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-26
    • 2020-09-14
    • 1970-01-01
    • 2011-10-26
    • 2020-01-01
    • 2020-11-07
    • 1970-01-01
    相关资源
    最近更新 更多