SystemVerilog:一旦类对象不再被引用,动态数组(类内)是否保证会被垃圾收集



所以我的问题是:;标题";SystemVerilog中动态数组的垃圾收集规则是什么?

上下文:

在我的程序中,我发现了一个错误,你可以在函数中实例化一个动态数组(本地(,并在该函数中向该数组添加元素,但如果你不删除数组,条目就会保留在那里(即内存和引用被保留(。因此,当您再次调用该函数时,可以访问以前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆而不是堆栈上实例化的,编译器不知道何时对其进行垃圾收集,因为它可能是一个返回的引用(如果我错了,请纠正我-我不熟悉动态数组的垃圾收集规则(。

然而,如果动态数组在类中实例化(作为成员变量(,会发生什么?你如何知道动态数组是否被删除(即引用和内存被删除(?这种情况下的垃圾收集规则是什么?

如果有帮助的话,我有示例代码来演示这个问题,但我认为没有必要包括它(如果你想要一个示例,请告诉我(。附言:关联数组也会发生同样的情况(因为我认为它是SystemVerilog中动态数组类型的一种形式(。

谢谢!

SystemVerilog有三种不同类型的变量寿命:

  • 静态-在模拟的整个生命周期中都存在。在时间0初始化一次。可以从声明的范围之外引用
  • automatic——为声明它的作用域的每个条目创建并初始化一个新实例(必须是过程作用域(。它的生存期在退出作用域时结束,并且所有嵌套作用域都退出(以处理fork/join_none(只能从声明它的作用域内引用
  • 动态的——由过程语句的执行创建。它的生命周期可以通过多种方式结束,但通常通过执行过程性语句来结束

动态大小的数组具有寿命的复合概念。单个元素具有动态寿命,但数组作为一个整体可以具有上述任何寿命。就你的问题而言,我认为我们可以将数组视为一个集合。这意味着每当数组变量的生命周期结束时,所有动态分配的元素都会被回收

类对象具有动态生存期,但持有引用类对象的句柄的类变量可以具有上述任何生存期。但是,由于多个类变量可以引用同一个类对象,当没有更多的类变量引用该对象时,类对象的生存期就结束了。因此,如果该类对象包含动态数组变量,那么当对象的生存期结束时,这些变量的生存期就会结束。

SystemVerilog没有指定垃圾收集的工作方式。当某个东西的生命周期结束时,你无法再访问它。无法知道内存何时真正被回收。

您的问题似乎是在函数内部有一个静态声明的动态数组,或者一个静态函数参数。在Verilog中,默认情况下,所有非类函数都具有静态生存期。类方法只能具有自动生存期。如果这个解释不能回答你的问题,你需要发布一些代码。


BTW,这成为我2021年DVCon论文和演示的主题

最新更新