关于句柄传输的疑惑
function xxx(transaction tr);
tr.data = 10;
endfunction
transaction t;
initial begin
t = new();
xxx(t);
$display(t.data):
end
大家觉得应该显示什么。
我记得书中有句话是传输句柄,如果不加ref,仅仅是句柄复制,并不能做到真正的句柄地址传输,故调用xxx函数,理论上不能改变原句柄所指向的对象的成员的值,但是,这里却改变了,请教大家,我哪里理解错误。
我觉得是这里是句柄复制没错,但是这两个句柄都指向同一个object,
所以你的结果会变。
真正的句柄传输指的是function里面的handle和外面的是一样的句柄,而实际
上这俩个handle是不一样的,只是指向了同一个object
那么按照你这么说,那你看看这个程序会怎样
function xxx(transaction tr);
tr = new();
tr.data = 10;
endfunction
transaction t;
initial begin
xxx(t);
$display(t.data):
end
你觉得执行完后结果会怎样呢
这个就是开始 tr被copy进 function后,这是由于tr是null,
所以这时被复制进去的t也是null,然后执行function,创建一个object
这时function里的t就有值了,但是外面的tr还是null,
所以外面的tr会找不到data
不好意思哈 ,还不很了解,为什么“第一个例子”可以呢,没有ref参数,仅仅句柄复制,不是改变不了原句柄所指向的对象的成员的值吗?仅仅改变的是函数内部句柄tr的值,对外面的那个句柄t,不受影响的啊。
你说的--我觉得是这里是句柄复制没错,但是这两个句柄都指向同一个object,所以你的结果会变。
那么“第二个例子”也是同指向一个object,为什么结果不变啊?
第一个例子在复制进function的同时也将handle指向的object的地址也就是handle的value给复制了
所以在func里面可以使用该handle来改变object的值
第二例子则是由于在复制进func之前,handle没被创建还是null所以复制进去的handle也是null,因此这时你虽然在func里面创建了object,里面的handle的value不为null,但是也不会改变外面的handle的value是null,因此。
哦,明白了,第二个例子的函数加上“ref”这个参数,就可以实现句柄地址的输出,也就可以通过调用函数来改变函数完的值了!
function xxx(reftransaction tr);
tr = new();
tr.data = 10;
endfunction
transaction t;
initial begin
xxx(t);
$display(t.data):
end
准确点是加ref是指里面的和外面的是一个handle!
明白了 ,非常感谢哈