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