什么时候需要浅拷贝(而不是深拷贝)?

问题描述 投票:0回答:9

有人可以举一个需要浅拷贝的情况的例子吗?

请注意,在某些情况下,浅复制和深复制是相同的。当对象对其任何子变量没有所有权时,就会发生这种情况;也就是说,所有子变量都是“聚合”的。我想看一些例子,其中对象是由它拥有的变量组成的,并且仍然需要浅层复制它们。

备注

:我不在乎示例是用哪种语言给出的。我从 C++/Java/C# 的角度问这个问题,尽管我认为复制是一个与语言无关的概念。

c# java c++ language-agnostic
9个回答
8
投票


3
投票

您可以存储浅拷贝,然后从反序列化时的状态重建完整的对象。


3
投票


3
投票
您希望对 
Example.elementList

的所有修改都通过对象方法完成,但您希望公开存储在列表中的元素。因此,您创建了返回浅拷贝的 getter。复制,因为您不希望调用者修改对象的列表和浅层,因为您想公开列表中的对象,而不是它们的副本。

    


3
投票

蝇量是一个物体 通过共享来最大限度地减少内存使用 与其他数据尽可能多的数据 类似的物体;这是一种使用方式 当一个简单的对象时,会出现大量的对象 重复表示将使用 内存量不可接受。

这对于浅拷贝来说是可以接受的。

正如我在回答您的相关问题时指出的那样,许多语言实际上并没有浅复制和深复制的概念。然而,C++ 中的此类阻止您使用 NULL 指针,这可能是需要“浅”复制的示例:


2
投票

该类不拥有所指向的内容,因此不应复制。


我对此的看法是,对于 C++ 和 Java,使用深复制的情况是不同的。


2
投票

在 C++ 中,您可以使用深度复制来避免困难的内存管理问题,或者更轻松地实现多线程应用程序。

  • 在 Java 中,由于这些原因不需要深复制。由于这两种语言都是垃圾收集的,因此没有必要通过循环来释放数据结构。所以不需要深拷贝来简化问题。同样,Java 内置支持多线程同步访问共享数据结构。

  • 在大多数情况下,假设应用程序的数据结构设计良好,则在 Java 中不需要深度复制。

浅拷贝制作速度更快,出于显而易见的原因,这通常是可取的。浅复制的最终目标显然只是复制原始对象的引用。如果您不改变对象并且可以保证在使用它时不会以其他方式更改它,那么副本越浅越好。


1
投票

备注:我不在乎示例是用哪种语言给出的。我从 C++/Java/C# 的角度问这个问题,尽管我认为复制是一个与语言无关的概念。

1
投票
我认为这在很大程度上取决于语言。

在 C++ 中,复制所扮演的角色与 Java/C# 中的角色截然不同。在 C++ 中,我想不出很多浅复制有意义的情况。您通常只需创建对象的引用或指针即可。复制构造函数通常实现深复制,因为在 C++ 中,对象拥有其成员的所有权,并负责管理它们的生命周期。因为没有 GC,所以这些所有权语义变得很重要,并且您不能在没有特别注意的情况下让两个对象指向第三个对象(它们是否使用引用计数来保持第三个对象处于活动状态?如果没有,那么这两个对象中的哪一个拥有
是吗?)

我什至会说“深”和“浅”副本之间的区别在 C++ 中并没有真正的意义。副本创建了新创建的对象工作所需的所有内容。有时,它共享

一点的数据(通常是不属于任何一个对象的数据),因此它可能不是“真正的”深拷贝”,但它也不是浅的,因为类的大部分通常是

复制。

© www.soinside.com 2019 - 2024. All rights reserved.