首页 > 其他分享 >对象拷贝

对象拷贝

时间:2023-01-29 20:11:18浏览次数:37  
标签:p2 p1 addr 对象 display new 拷贝 id

1.对象拷贝

1.1 浅拷贝

当pkt与新对象new objects的构造函数new()一起使用时,pkt中的内容将被复制到pkt2中。

Packet pkt, pkt2;
pkt = new;
pkt2 = new pkt;

这种方法称为浅拷贝,因为所有变量都跨整数、字符串、实例句柄等进行复制,但嵌套对象并未完全复制。只有它们的句柄将分配给新对象,因此两个packet都将指向同一个嵌套对象实例。为了说明这一点,让我们看一个例子.

class Header;
int id;
function new (int id);
this.id = id;
endfunction
function showId();
$display ("id=0x%0d", id);
endfunction
endclass
 
class Packet;
int addr;
int data;
Header hdr;
function new (int addr, int data, int id);
hdr = new (id);
this.addr = addr;
this.data = data;
endfunction
function display (string name);
$display ("[%s] addr=0x%0h data=0x%0h id=%0d", name, addr, data, hdr.id);
endfunction
endclass
module tb;
Packet p1, p2;
initial begin
// Create a new pkt object called p1
p1 = new (32'hface_cafe, 32'h1234_5678, 26);
p1.display ("p1");
// Shallow copy p1 into p2; p2 is a new object with contents in p1
p2 = new p1;
p2.display ("p2");
// Now let's change the addr and id in p1
p1.addr = 32'habcd_ef12;
p1.data = 32'h5a5a_5a5a;
p1.hdr.id = 17;
p1.display ("p1");
// Print p2 and see that hdr.id points to the hdr in p1, while addr and data remain unchanged.
p2.display ("p2");
end
endmodule

类Packet包含一个名为Header的嵌套类。首先,我们创建了一个名为p1的数据包并为其分 配了一些值。然后使用浅拷贝方法将p2创建为p1的副本。为了证明只复制句柄而不是整个对 象,修改了p1数据包的成员,包括嵌套类中的成员。当打印p2中的内容时,我们可以看到嵌 套类中的id成员保持不变。

这是一种简易复制(shallow copy),原对象的值被盲目copy到对象中,如果类A1中包含一个指向另一个子类B的句柄,那么复制类A2中只是复制了子类B的句柄,A1和A2中的B对象指向的是同一个对象。

1.2 深拷贝

深拷贝是复制所有内容(包括嵌套对象)的地方,通常需要自定义代码来实现此目的。

Packet p1 = new;
Packet p2 = new;
p2.copy (p1);

让我们在上面给出的示例中添加一个在Packet类中调用的自定义函数copy()。

class Packet;
...
 function copy (Packet p);
 this.addr = p.addr;
 this.data = p.data;
 this.hdr.id = p.hdr.id;
 endfunction
...
endclass
module tb;
Packet p1, p2;
initial begin
p1 = new (32'hface_cafe, 32'h1234_5678, 32'h1a);
p1.display ("p1");
p2 = new (1,2,3); // give some values
p2.copy (p1);
p2.display ("p2");
//Now let's change the addr and id in p1
p1.addr = 32'habcd_ef12;
p1.data = 32'h5a5a_5a5a;
p1.hdr.id = 32'h17;
p1.display ("p1");
// Now let's print p2 - you'll see the changes made to hdr id
// but not addr
p2.display ("p2");
end
endmodule

请注意,我们在 copy() 这里调用了自定义函数而不是浅拷贝方法,因此 Header 对象的内 容也应该被复制到p2中。请注意,即使p1的id字段已更改,对象p2的id仍保留先前的值。

标签:p2,p1,addr,对象,display,new,拷贝,id
From: https://www.cnblogs.com/lanlancky/p/17073728.html

相关文章