QList :: QList(const QList& other) 构造其他的副本。
此操作需要一段时间, 因为隐式共享QList。 这使得从a返回QList 功能很快。如果共享 实例被修改,它将是 复制(copy-on-write),这需要 线性时间。
然后在关于被隐式共享的链接上,它讨论了引用计数和写时复制。这是一份很深的副本还是一份浅薄的副本?
答案 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一样。