Shallow Copy(影子拷贝) VS Deep Copy(深拷贝)

本文介绍了浅拷贝(ShallowCopy)与深拷贝(DeepCopy)的概念及其实现方式。浅拷贝创建新对象并仅复制非静态字段,对于引用类型的字段则只复制引用而非对象本身。而深拷贝不仅复制对象,还复制所有引用的对象,确保完全独立。

Shallow Copy : 影子拷贝,msdn翻译为”浅表副本”
Deep Copy : 深拷贝, msdn翻译为”深层副本”


Shallow Copy与Deep Copy是用来在对象之间复制数据.

DotNET Framework用System.Object. MemberwiseClone方法创建Shallow Copy,它创建一个新对象,然后
将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,
则复制引用(reference)但不复制引用的对象(referred object);因此,原始对象及其复本引用
同一对象。

考虑引用对象 A 和 B 的被称为 X 的对象。对象 B 依次引用对象 C。X 的浅表副本创建一个新对象
X2,该对象也引用对象 A 和 B。相比而言,X 的深层副本创建一个新对象 X2,该对象引用新对象 A2
和 B2(分别为 A 和 B 的副本)。B2 又引用新对象 C2,C2 是 C 的副本。

在SystemVerilog中,浅拷贝深拷贝主要用于处理复合对象(如包含其他对象的对象),二者存在明显差异且具有不同的用途。 浅拷贝只复制指向对象的指针,而不复制引用对象本身。也就是说,原对象和拷贝对象指向同一个内存资源,复制的仅仅是一个指针,对象本身资源只有一份。若对拷贝对象执行修改操作,原对象引用的对象同样会被修改,这可能违背复制拷贝的初衷。例如: ```systemverilog class MyClass; int data; function new(int val); data = val; endfunction endclass module test; MyClass obj1, obj2; initial begin obj1 = new(10); obj2 = obj1; // 浅拷贝 obj2.data = 20; $display("obj1.data: %0d", obj1.data); // 输出20,因为obj1和obj2指向同一对象 end endmodule ``` 深拷贝则是复制引用对象本身,在内存中存在两份独立的对象。对拷贝对象进行修改操作不会影响原对象。例如: ```systemverilog class MyClass; int data; function new(int val); data = val; endfunction function MyClass clone(); clone = new(data); endfunction endclass module test; MyClass obj1, obj2; initial begin obj1 = new(10); obj2 = obj1.clone(); // 深拷贝 obj2.data = 20; $display("obj1.data: %0d", obj1.data); // 输出10,因为obj1和obj2是独立的对象 end endmodule ``` 浅拷贝的目的在于快速复制对象,只复制指针,开销较小,适用于不需要独立副本的场景。深拷贝的目的是创建对象的完全独立副本,避免修改拷贝对象时影响原对象,适用于需要独立操作副本的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值