我正在用 C++ 构建一个游戏引擎库。不久前,我正在使用 Qt 构建一个应用程序,并且对它对Implicit Sharing的使用非常着迷。我想知道是否有人可以更详细地解释这种技术,或者可以提供一个简单的例子。
1 回答
隐式共享背后的关键思想似乎是使用更常见的术语copy-on-write来解决的。写时复制背后的想法是让每个对象充当指向实际实现的指针的包装器。每个实现对象都跟踪指向它的指针的数量。每当在包装对象上执行操作时,它都会被转发到执行对象,后者执行实际工作。
这种方法的优点是复制和销毁这些对象很便宜。要制作对象的副本,我们只需创建一个包装器的新实例,将其指针设置为指向实现对象,然后增加指向该对象的指针数量的计数(有时称为引用计数,顺便一提)。销毁类似——我们将引用计数减一,然后查看是否有其他人指向实现。如果没有,我们释放它的资源。否则,我们什么也不做,只是假设其他人稍后会进行清理。
这种方法的挑战在于它意味着多个不同的对象都将指向同一个实现。这意味着如果有人最终对实现进行了更改,那么引用该实现的每个对象都会看到这些更改——这是一个非常严重的问题。为了解决这个问题,每次执行可能会更改实现的操作时,该操作都会通过查看引用计数是否相同 1 来检查是否有任何其他对象也引用了该实现。如果没有其他对象引用该对象,则操作可以继续进行 - 更改传播的可能性不大。如果至少有一个其他对象引用该数据,则包装器首先为自己制作一个实现的深拷贝,并将其指针更改为指向新对象。
如果您想查看一些实际的示例,请查看斯坦福的 C++ 编程入门课程中的讲座示例 15.0 和 16.0 。它展示了如何使用这种技术设计一个对象来保存单词列表。
希望这可以帮助!