什么是隐式共享?

14

我正在用C++构建一个游戏引擎库。不久之前,我使用Qt构建应用程序,并对其使用隐式共享的方式感到非常着迷。我想知道是否有人能够更详细地解释这种技术,或者提供一个简单的实现示例。


5
你提供了一个链接到文档,非常好地解释了它是如何工作的。甚至还提到了线程文档,解释了原子引用计数如何帮助多线程应用程序。如果仍有不清楚的地方,你应该就那个问题提出更详细的问题。不要忘记你可以随时查看Qt的源代码。 - Sergei Tachenov
1
隐式共享 的另一个名称是 写时复制。您可能想查看在 SO 上提到此其他名称的问题,例如此问题:https://dev59.com/rHRB5IYBdhLWcg3wa2q2 - Piotr Dobrogost
我相信隐式共享只是Qt实现的写时复制。 - HelloGoodbye
1个回答

38
隐式共享的核心思想似乎是使用更常见的“写时复制”术语。写时复制的想法是让每个对象作为指向实际实现的指针的封装器。每个实现对象跟踪指向它的指针数。每当在封装器对象上执行操作时,它会被转发到执行实际工作的实现对象。
这种方法的优点是这些对象的复制和销毁非常便宜。要复制对象,我们只需创建一个新的封装器实例,将其指针设置为指向实现对象,然后增加指向对象的指针数(顺便说一句,这有时被称为引用计数)。销毁类似-我们将引用计数减少1,然后查看是否有其他人指向实现对象。如果没有,则释放其资源。否则,我们什么也不做,只假设其他人稍后会进行清理。
这种方法的挑战在于,这意味着多个不同的对象都将指向相同的实现。这意味着如果某人最终对实现进行更改,则引用该实现的每个对象都将看到更改-这是一个非常严重的问题。为了解决这个问题,每次执行可能潜在地更改实现的操作时,操作都会检查是否有其他对象也通过查看引用计数是否完全相同来引用该实现。如果没有其他对象引用该对象,则操作可以继续-没有可能传播更改。如果至少有一个其他对象引用数据,则封装器首先为自己制作实现的深层副本,并将其指针更改为指向新对象。现在我们知道不可能有任何共享,可以轻松进行更改。
如果您想查看这些内容的示例,请查看斯坦福大学介绍C ++编程课程的讲座示例15.0和16.0。它展示了如何使用此技术设计一个包含单词列表的对象。
希望能对您有所帮助!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接