deep copy and shallow copy

链接A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用。其实都是实现了引用语义。深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。COW语义是“深拷贝”与“推迟计算”的组合,仍然是深拷贝,而非浅拷贝,因为拷贝之后的两个对象的数据在逻辑上是不相关的,只是内容相同。举个简单的例子:当你实现一个Composite Pattern,你通常都会实现一个深拷贝(如果需要拷贝的话),很少有要求同的Composite共享Leaf的;而当你实现一个Observer Pattern时,如果你需要拷贝Observer,你大概不会去拷贝Subject,这时就要实现个浅拷贝。是深拷贝还是浅拷贝,并不是取决于时间效率、空间效率或是语言等等,而是取决于哪一个是逻辑上正确的。1:没有虚方法和虚基类2:所有直系基类的copy constructor都是无代价的3:所有成员的copy constructor都是无代价的这时它的copy constructor是无代价的,相当于用memcpy实现。判断它是深拷贝还是浅拷贝,还是要根据类的实现。
A:浅拷贝就是成员数据之间的一一赋值:把值赋给一一赋给要拷贝的值。但是可能会有这样的情况:对象还包含资源,这里的资源可以值堆资源,或者一个文件。。当值拷贝的时候,两个对象就有用共同的资源,同时对资源可以访问,这样就会出问题。深拷贝就是用来解决这样的问题的,它把资源也赋值一次,使对象拥有不同的资源,但资源的内容是一样的。对于堆资源来说,就是在开辟一片堆内存,把原来的内容拷贝。如果你拷贝的对象中引用了某个外部的内容(比如分配在堆上的数据),那么在拷贝这个对象的时候,让新旧两个对象指向同一个外部的内容,就是浅拷贝;如果在拷贝这个对象的时候为新对象制作了外部对象的独立拷贝,就是深拷贝引用和指针的语义是相似的,引用是不可改变的指针,指针是可以改变的引用。其实都是实现了引用语义。深拷贝和浅拷贝的区别是在对象状态中包含其它对象的引用的时候,当拷贝一个对象时,如果需要拷贝这个对象引用的对象,则是深拷贝,否则是浅拷贝。COW语义是“深拷贝”与“推迟计算”的组合,仍然是深拷贝,而非浅拷贝,因为拷贝之后的两个对象的数据在逻辑上是不相关的,只是内容相同。举个简单的例子:当你实现一个Composite Pattern,你通常都会实现一个深拷贝(如果需要拷贝的话),很少有要求同的Composite共享Leaf的;而当你实现一个Observer Pattern时,如果你需要拷贝Observer,你大概不会去拷贝Subject,这时就要实现个浅拷贝。是深拷贝还是浅拷贝,并不是取决于时间效率、空间效率或是语言等等,而是取决于哪一个是逻辑上正确的。1:没有虚方法和虚基类2:所有直系基类的copy constructor都是无代价的3:所有成员的copy constructor都是无代价的这时它的copy constructor是无代价的,相当于用memcpy实现。判断它是深拷贝还是浅拷贝,还是要根据类的实现。
时间: 2024-10-25 17:27:04

deep copy and shallow copy的相关文章

Summary: Deep Copy vs. Shallow Copy vs. Lazy Copy

Object copy An object copy is an action in computing where a data object has its attributes copied to another object of the same data type. An object is a composite data type in object-oriented programming languages. The copying of data is one of the

Java里的Deep Copy和Shallow Copy

以前从来没听说过这两个名词,这几天用List和Map的时候发现bug,才第一次在stackoverflow上知道有这么两个简单的专业术语可以形容我遇到的问题. 写下来的都是基于自己的理解,或许不准确,如果以后发现不对再回来修正. 首先,Java的数据类型只有两种:primitive type和object type. 基本数据类型(primitive type)在赋值的时候,只存在一种情况,因为他们的内存位置就是他们的实际值的位置,如果把一个变量赋值给另一个变量,也会在内存增加一个新的值. 对于

copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

本文来自 这里,原文作者微博MicroCai 概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制就是内容拷贝. 集合的浅复制 (shallow copy) 集合的浅复制有非常多种方法.当你进行浅复制时,会向原始的集合发送retain消息,引用计数加1,同时指针被拷贝到新的集合. 现在让我们看一些浅复制的例子: NSArray *shallowCop

Shallow copy and Deep copy

一.来自wikipidia的解释: Shallow copy One method of copying an object is the shallow copy. In that case a new object B is created, and the fields values of A are copied over to B. This is also known as a field-by-field copy,field-for-field copy, or field co

[C++] Deep copy ,Shallow copy, copy constructor,"="

Deep copy ,Shallow copy, copy constructor,"=" Dog.h #pragma once class Dog { public: char *name; Dog(); Dog(const Dog &it); ~Dog(); void operator =(const Dog &it); }; Dog.cpp #include "Dog.h" #include<string.h> #include&l

python中的shallow copy 与 deep copy

今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. 而function2()也把list作为参数传入使用,在调用完function1()之后再调用function2()就出现了问题,list中的值已经被改变了,就出现了bug. 直接上代码: list = [0, 1, 2, 3, 4, 5] def function1(list): del lis

猫猫整理问题之:copy,对象自定义copy

猫猫分享,必须精品 原文地址:http://blog.csdn.net/u013357243?viewmode=contents copy copy的正目的 copy 目的:建立一个副本,彼此修改,各不干扰 Copy(不可变)和MutableCopy(可变)针对Foundation框架的数据类型. 对于自定义类,copy就是可变的. 可变数组的copy 这里用NSMutableArray为例子. // 可变=>可变&不可变,内存地址都会变化 void copyDemo1() { NSMuta

理解一下python中的浅copy和深copy

最近在学习过程中,了解了一下,浅copy和深copy,做个记录. 所谓浅拷贝就是对引用的拷贝,所谓深拷贝就是对对象的资源的拷贝. 首先,对赋值操作我们要有以下认识: 赋值是将一个对象的地址赋值给一个变量,让变量指向该地址( 旧瓶装旧酒 ). 修改不可变对象(str.tuple)需要开辟新的空间 修改可变对象(list等)不需要开辟新的空间 浅拷贝仅仅复制了容器中元素的地址 >>> user = ['tom', ['age', 20]] >>> user_new = us

C++中关于继承中constructor、copy constructor、copy assignment的一些笔记

1.如果成员初值列不包含基类,则constructor.copy constructor  都隐式的调用基类无参的constructor 2.派生类默认的copy constructor.copy assignment会调用基类的  相应成员.而自己定义的则不会. 3.如果基类的copy assignment为private,则派生类不会生成默认的  copy assignment