我们有浅拷贝和深拷贝,当我们想要用C++复制对象时,他们可以为我们完成这项工作.那么,
什么是懒复制?
这是程序员或编译器自己做的事情吗?
什么是懒惰副本有利的编程方案?
什么是懒复制?
维基百科恰当地定义了这一点.
惰性副本是浅拷贝和深拷贝的组合.最初复制对象时,使用(快)浅拷贝.计数器还用于跟踪共享数据的对象数.当程序想要修改对象时,它可以确定数据是否被共享(通过检查计数器)并且可以在必要时进行深层复制.懒惰副本只是作为深层副本向外看,但尽可能利用浅副本的速度.由于反击,下行相当高但基本成本不变.此外,在某些情况下,循环引用也可能导致问题.
这是程序员或编译器自己做的事情吗?
程序员必须为自己的类实现此行为.
默认情况下,编译器在复制函数(复制构造函数和赋值运算符)中执行浅拷贝.
Deep Copy是程序员必须为他的类实现的,因此可以对复制函数使用成员(指针)的特殊处理.
什么是懒惰副本有利的编程方案?
理想情况下,
复制对象导致性能损失但是对象未被非常频繁地修改的情况下,懒惰副本在性能方面将是有利的.
维基百科引用了许多例子,其中使用了懒惰复制(写入时复制).
我不确定你所说的“拥有可以为我们完成工作的浅层和深层副本”是什么意思。当您编写复制构造函数和赋值运算符时,您需要决定如何进行复制。
在浅复制中,您只需直接复制对象成员即可。如果这些成员是指向堆内存的指针,则副本指向堆内存的同一块。如果您不提供复制构造函数,这是 C++ 执行的默认复制。
在深层复制中,成员指针指向的任何内存都会被复制(也可能在这些对象的成员上递归)。
在惰性副本中,您从浅副本开始。如果该对象或其子对象从未被修改,那么就没有问题。无需制作堆内存的第二个副本。当两个副本中的任何一个被修改时,首先执行深层复制,以便修改不会应用到两个对象。这也称为写入时复制。
惰性复制的目的是获得深复制的外观,并具有浅复制的一些性能优势。这最终是否会带来性能提升取决于对象的使用情况。如果您计划拥有多个未修改的对象副本,那么您可能会看到其中的优势。如果大多数对象最终都会被修改,那么优势就会消失。当对象被频繁修改时,在修改对象之前检查是否已执行深复制的开销使其性能比普通深复制差。
字符串经常被认为是惰性复制的好地方,因为很多时候,复制只是为了在不同的地方显示,但大多数字符串要么使用深复制,要么使用浅复制,并且完全不允许修改。