SystemVerilog:一旦不再引用 class-object,动态数组(在 类 内)是否保证为 garbage-collected?
SystemVerilog: Are dynamic arrays (inside classes) guaranteed to be garbage-collected once the class-object is not referenced anymore?
所以我的问题是:SystemVerilog 中动态数组的“标题”和垃圾 collection 规则是什么?
上下文:
在我的程序中,我发现了一个错误,您可以在其中(本地)在函数中实例化动态数组并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即保留内存和引用)。因此,当您再次调用该函数时,可以访问之前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对其进行垃圾收集,因为它可能是返回的引用(如果我错了请纠正我 -我不熟悉动态数组的垃圾 collection 规则。
但是,如果在 class 中实例化动态数组(作为成员变量)会怎样?你怎么知道动态数组是否被删除(即引用和内存被删除)?这种情况下的垃圾 collection 规则是什么?
我有示例代码来演示这个问题,如果它有帮助的话,但我认为没有必要包括它(如果你想要一个例子,请告诉我)。
P.S。 associative-arrays 也会发生同样的事情(因为我认为它是 SystemVerilog 中动态数组类型的一种形式)。
谢谢!
SystemVerilog 具有三种不同的变量生命周期:
- static -- 在模拟的整个生命周期中都存在。在时间 0 初始化一次。可以从它声明的范围之外引用
- 自动 -- 为声明它的范围(必须是过程范围)的每个条目创建并初始化一个新实例。它的生命周期在退出作用域时结束,所有嵌套作用域退出(处理
fork/join_none
)只能从声明它的作用域内引用
- 动态 -- 通过执行过程语句创建。它的生命周期可以通过多种方式结束,但通常是通过执行程序语句来结束。
动态大小的数组具有生命周期的复合概念。单个元素具有动态生命周期,但数组作为一个整体聚合可以具有上述任何生命周期。出于您的问题的目的,我认为我们可以将数组视为一个聚合。这意味着每当数组变量的生命周期结束时,所有动态分配的元素都会被回收
Class 对象具有动态生命周期,但是持有句柄引用 class 对象的 class 变量可以是上述任何生命周期。但是由于不止一个 class 变量可以引用同一个 class 对象,当没有更多 class 变量引用该对象时,class 对象的生命周期结束。因此,如果 class 对象包含动态数组变量,则这些变量的生命周期会在对象生命周期结束时结束。
SystemVerilog 未指定垃圾收集的工作方式。当某物的生命周期结束时,您将无法再访问它。无法知道内存何时真正被回收。
您的问题似乎是您在函数内部有一个静态声明的动态数组,或一个静态函数参数。在 Verilog 中,所有非 class 函数默认都具有静态生命周期。 Class 方法只能有自动生命周期。如果此解释不能回答您的问题,您将需要 post 一些代码。
顺便说一句,这成了我DVCon 2021 Paper and Presentation
的主题
所以我的问题是:SystemVerilog 中动态数组的“标题”和垃圾 collection 规则是什么?
上下文:
在我的程序中,我发现了一个错误,您可以在其中(本地)在函数中实例化动态数组并在该函数中向该数组添加元素,但如果您不删除该数组,条目将保留在那里(即保留内存和引用)。因此,当您再次调用该函数时,可以访问之前输入的所有条目。解决方案是在退出函数之前简单地删除动态数组。我假设数组没有被删除,因为数组是在堆上而不是堆栈上实例化的,并且编译器不知道何时对其进行垃圾收集,因为它可能是返回的引用(如果我错了请纠正我 -我不熟悉动态数组的垃圾 collection 规则。
但是,如果在 class 中实例化动态数组(作为成员变量)会怎样?你怎么知道动态数组是否被删除(即引用和内存被删除)?这种情况下的垃圾 collection 规则是什么?
我有示例代码来演示这个问题,如果它有帮助的话,但我认为没有必要包括它(如果你想要一个例子,请告诉我)。 P.S。 associative-arrays 也会发生同样的事情(因为我认为它是 SystemVerilog 中动态数组类型的一种形式)。
谢谢!
SystemVerilog 具有三种不同的变量生命周期:
- static -- 在模拟的整个生命周期中都存在。在时间 0 初始化一次。可以从它声明的范围之外引用
- 自动 -- 为声明它的范围(必须是过程范围)的每个条目创建并初始化一个新实例。它的生命周期在退出作用域时结束,所有嵌套作用域退出(处理
fork/join_none
)只能从声明它的作用域内引用 - 动态 -- 通过执行过程语句创建。它的生命周期可以通过多种方式结束,但通常是通过执行程序语句来结束。
动态大小的数组具有生命周期的复合概念。单个元素具有动态生命周期,但数组作为一个整体聚合可以具有上述任何生命周期。出于您的问题的目的,我认为我们可以将数组视为一个聚合。这意味着每当数组变量的生命周期结束时,所有动态分配的元素都会被回收
Class 对象具有动态生命周期,但是持有句柄引用 class 对象的 class 变量可以是上述任何生命周期。但是由于不止一个 class 变量可以引用同一个 class 对象,当没有更多 class 变量引用该对象时,class 对象的生命周期结束。因此,如果 class 对象包含动态数组变量,则这些变量的生命周期会在对象生命周期结束时结束。
SystemVerilog 未指定垃圾收集的工作方式。当某物的生命周期结束时,您将无法再访问它。无法知道内存何时真正被回收。
您的问题似乎是您在函数内部有一个静态声明的动态数组,或一个静态函数参数。在 Verilog 中,所有非 class 函数默认都具有静态生命周期。 Class 方法只能有自动生命周期。如果此解释不能回答您的问题,您将需要 post 一些代码。
顺便说一句,这成了我DVCon 2021 Paper and Presentation
的主题