Qt 4.5 - QList :: QList(const QList&) - 这是一个深层复制构造函数吗?

时间:2009-08-14 10:22:06

标签: qt qt4

我对documentation.

的QList拷贝构造函数感到困惑
  

QList :: QList(const QList& other)   构造其他的副本。

     

此操作需要一段时间,   因为隐式共享QList。   这使得从a返回QList   功能很快。如果共享   实例被修改,它将是   复制(copy-on-write),这需要   线性时间。

然后在关于被隐式共享的链接上,它讨论了引用计数和写时复制。这是一份很深的副本还是一份浅薄的副本?

4 个答案:

答案 0 :(得分:5)

这是一个浅薄的副本。第一次在副本或原始列表上调用非const函数时,会在幕后发生数据的深层复制。

答案 1 :(得分:3)

  

此操作需要一段时间,   因为隐式共享QList。

如果您不修改列表,那么这些是共享的!所以在幕后,您在相同的地址阅读信息!

  

如果修改了共享实例,则为   将被复制(写时复制),和   需要线性时间。

但是如果您修改了副本列表,则没有其他选择可以有效地复制列表!因此,根据列表大小,您有线性成本。

from qt doc on copy on write and shared memory :

  

深拷贝意味着重复一个   宾语。浅拷贝是参考   复制,即只是指向共享的指针   数据块。制作一份深刻的副本即可   在内存和CPU方面都很昂贵。   制作浅色副本非常快,   因为它只涉及设置一个   指针和递增引用   计数。

因此,如果您不修改列表,则读取与作为参数给出的列表相同的地址处的信息,它称为浅拷贝。如果您修改它,您将拥有该列表的深层副本。

答案 2 :(得分:2)

复制构造函数执行快速(浅)复制。如果您随后修改了原始列表或其副本,则会生成数据的深层副本。

如果您有任何疑问,我建议您重新阅读copy-on-write语义上的文档。

这与QString,QList,QArray和许多其他Qt类的行为相同。

答案 3 :(得分:-2)

AFAIK,在复制内容时(写入时),它会调用列表中每个元素的复制构造函数,就像std :: list一样。