Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是隐性共享? 我在C++中构建了一个游戏引擎库。不久前,我正在使用Qt构建一个应用程序,对它的使用非常着迷。我想知道是否有人能更详细地解释这项技术,或者提供一个简单的例子来说明这一点。_C++_Qt_Copy On Write - Fatal编程技术网

什么是隐性共享? 我在C++中构建了一个游戏引擎库。不久前,我正在使用Qt构建一个应用程序,对它的使用非常着迷。我想知道是否有人能更详细地解释这项技术,或者提供一个简单的例子来说明这一点。

什么是隐性共享? 我在C++中构建了一个游戏引擎库。不久前,我正在使用Qt构建一个应用程序,对它的使用非常着迷。我想知道是否有人能更详细地解释这项技术,或者提供一个简单的例子来说明这一点。,c++,qt,copy-on-write,C++,Qt,Copy On Write,隐式共享背后的关键思想似乎是使用更常见的术语“写时拷贝”。写时复制背后的思想是让每个对象作为指向实际实现的指针的包装器。每个实现对象都跟踪指向它的指针的数量。每当在包装器对象上执行一个操作时,它就被转发到执行实际工作的实现对象 这种方法的优点是复制和销毁这些对象的成本很低。要创建对象的副本,我们只需创建一个包装器的新实例,将其指针设置为指向实现对象,然后增加指向该对象的指针数(顺便说一句,这有时称为引用计数)。销毁与此类似——我们将引用计数减少1,然后查看是否有其他人指向该实现。如果没有,我们将

隐式共享背后的关键思想似乎是使用更常见的术语“写时拷贝”。写时复制背后的思想是让每个对象作为指向实际实现的指针的包装器。每个实现对象都跟踪指向它的指针的数量。每当在包装器对象上执行一个操作时,它就被转发到执行实际工作的实现对象

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

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

如果你想看到这方面的一些例子,请看一看中的课堂示例15.0和16.0。它展示了如何使用这种技术设计一个对象来保存一个单词列表


希望这有帮助

您提供了一个指向文档的链接,为其工作原理提供了极好的解释。它甚至还提到了。如果有些事情还不清楚,你应该问一个更详细的问题。别忘了你可以随时查看Qt的源代码。隐式共享的另一个名称是写时拷贝。你可能想看看提到这个名字的问题,比如这个:我相信隐式共享只是Qt的实现。