拷贝的含义
首先深拷贝和浅拷贝都是指拷贝一个对象,而不是句柄。当只拷贝对象中的成员变量和声明的句柄时,称为浅拷贝。而深拷贝会复制对象中的所有成员变量以及对象中嵌套的其他类的实例的内容。
举个例子,比如下面这个套娃(类的嵌套),当拷贝A的对象时:
class A ;
int [31:0]data_b;
B b; //声明句柄b,初始值为null
function new();
b = new(); //句柄b 指向一个对象
endfunction
endclass
class B ;
int [31:0]data_b;
...
endclass
解释代码:
- A在实例化时,会在A对象中实例化产生一个句柄b指向的对象;
- 浅拷贝时,只会拷贝A对象中的 成员变量data_a 和 B的句柄b,而不会拷贝B的对象中的内容;
- 深拷贝时,不仅仅会拷贝当前A的对象的成员变量,还会拷贝A实例中的B的对象内容,即进行深层次的复制;
浅拷贝
一般我们直接copy一个对象时,就是浅拷贝。如下:
class A ;
int [31:0]data_b;
B b;
function new();
b = new();
endfunction
endclass
class B ;
int [31:0]data_b;
...
endclass
module test_copy;
A a1,a2;
initial begin
a1 = new();
a2 = new a1; // a2浅拷贝a1
end
endmodule
特点:
- 浅复制只把对象中的句柄复制了,却没有复制句柄b所指向的对象。这会导致复制后,a2中的句柄b 和 a1 中的句柄b指向同一个对象,如果a2中的句柄b修改了对象的内容,那么a1中的句柄 b 所指向的内容也会发生变化。
- new操作符会创建了一个新的对象,并且复制了现有对象的所有变量,但是不会调用已经定义的任何构造函数。
👉自己定义拷贝方法还可以看:对象复制。
深拷贝
为了避免复制后的对象与被复制对象中的句柄指向同一个对象,就需要实现深拷贝,可以自己在类中定义copy方法,目的是为了在复制类中的套娃(对象里面另一个类的实例)时,产生一个新的句柄,并产生一个具有相同内容的对象。
//嵌套的类
class Deep_class ;
int [31:0]data_deep = 'h2;
//构造函数
function new();
endfunction
//拷贝函数,拷贝当前Deep_class 类的对象中的内容,并生成一个新的对象
function Deep_class copy();
Deep_class copy = new();
copy.data_deep= this.data_deep;
return copy;//返回句柄
endfunction
endclass
class shallow_class ;
int [31:0]data_shallow = 'h8;
Deep_class deep;
function new();
deep = new(); //实例化嵌套的类
endfunction
function shallow_class copy();
shallow_class copy = new();
copy.data_shadow= this.data_shallow;
copy.deep = deep.copy(); //获取Deep_class 类型的句柄
return copy;//返回shallow_class 类型句柄
endfunction
endclass
module test_copy;
shallow_class c1,c2;
initial begin
c1 = new();
c2 = c1.copy();
endmodule