在线咨询 切换到宽版
eetop公众号 创芯大讲堂 创芯人才网

 找回密码
 注册

手机号码,快捷登录

手机号码,快捷登录

搜帖子
查看: 745|回复: 4

[求助] 第一次发帖,想问一下绿皮书第三版中的一句话

[复制链接]
发表于 2024-12-2 16:53:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

×
本帖最后由 Apologize2U 于 2024-12-2 16:59 编辑

位于P119,是关于类的一些内容,作者举了一个将类比作房子的蓝图的比喻。问题:最后一句话该怎么理解?
以下是原文

而SystemVerilog中,激励对象不断被创建并且用来驱动DUT,检查结果。最后这些对象占用的内存可以被释放,以供新的对象使用。回到房子的比喻:房子的地址一般都是静止的,除非房子被烧毁导致你不得不重新盖新房。而垃圾回收从来不会是自动的,除非家里有儿童。


 楼主| 发表于 2025-7-31 16:58:34 | 显示全部楼层
本帖最后由 Apologize2U 于 2025-7-31 17:06 编辑

看来帖子是沉了,我又重新读了一遍,打算结合AI自己解答一下。
比喻前提:将类视为一个房子的蓝图,而一个对象就是一个实际的房子,房子的地址像一个句柄,唯一标志了你的房子。
房子指的是对象,房子的地址(即对象的句柄)一般是不会变的,该句柄指向一个新的对象,旧对象没法被引用了,可以理解为烧毁旧房盖新房。而你原先的对象,虽然没有句柄指向他,但是它不会立即被销毁,这个意思就是不会自动垃圾回收。除非家里有儿童这句话,我去查了原句为Garbage collection at home is not automatic, especially if you have teenagers.一种可能的解释是:家里的垃圾不会自己消失,尤其是你家里还有青少年,(指青少年会不断制造垃圾)。sv没有垃圾回收,但是有内存管理,当有不再使用的对象时,就赋值为null,自动回收(但具体是什么时候是不得而知的)。
SystemVerilog 3.1a LRM   11.26 Memory management 内存管理
对象、字符串、动态数组和关联数组的内存是动态分配的。创建对象时,SystemVerilog分配更多内存。当一个对象不再需要时,SystemVerilog自动回收内存,使其可供重用。自动内存管理系统是SystemVerilog的一个组成部分。如果没有自动内存管理,SystemVerilog的多线程、可重入环境会给用户带来很多问题。手动内存管理系统,例如C语言的malloc和free提供的系统,是不够的。

例如,考虑如下的例子
myClass obj =new;
fork
    task1(obj);
    task2(obj);
join_none
在本例中,主进程(分离两个任务的进程)不知道何时可以使用对象obj完成这两个进程。同样,task1和task2都不知道其他两个进程何时不再使用对象obj。从这个简单的示例中可以明显看出,没有一个进程拥有足够的信息来确定何时释放对象是安全的。用户只有两种选择:(1)小心行事,永远不要回收对象,或者(2)添加某种形式的引用计数,用于确定何时可以安全回收对象。采用第一个选项可能会导致系统很快耗尽内存。第二种选择给用户带来了很大的负担,他们除了管理测试平台之外,还必须使用不太理想的模式来管理内存。为了避免上面缺点,SystemVerilog自动管理所有动态内存。用户不需要担心悬空引用、过早回收或内存泄漏。系统将自动回收不再使用的物品。在上面的示例中,用户所做的就是在不再需要句柄obj时将它赋值为null。类似地,当对象超出作用域时,系统隐式地将null赋值给该对象。

补充内容 (2025-8-18 14:19):
不要在看上面的类比了,记住这个:SV的垃圾回收是自动的,当你不需要这个对象时,你就把指向该对象的句柄赋值为null,SV就会自动回收。
回复 支持 反对

使用道具 举报

发表于 2025-8-11 14:58:45 | 显示全部楼层
这里介绍的是OOP, 不是systemverilog. 如果是C++, 垃圾回收(内存回收)不是自动的, 但是systemverilog帮你做了这个事情, 所以在SV中, 只要没有handle指向的object, 就会自动回收, 因此SV的垃圾回收时自动的.

这里例子的意思是, 房子的位置(address)就像是内存的空间, 都是固定位置的, 你再这个地方建了个房子, 不要了, 那需要烧掉(垃圾回收), 然后在新建一个.
所以不要看这些类比, 类比经常就把事情比错, 就像把电流比作水流, 很多情况下可以类比, 但是完全不一样. 想要成为专家就不要看类比, 是什么就是什么.

new了一个object, 那么就是在内存里分配了一段空间. class的话, 分配的是类似指针的空间, 大小就是定义这个class里需要的各种信息的大小. 你可以再申请很多指针(handle)指向这个object. 对于SV来说, 当没有handle指向这个object的时候, 他就自动回收了, 不用像C一样去写delete
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-8-18 14:13:40 | 显示全部楼层


   
loglong 发表于 2025-8-11 14:58
这里介绍的是OOP, 不是systemverilog. 如果是C++, 垃圾回收(内存回收)不是自动的, 但是systemverilog帮你做 ...


感谢您的回复,我搜集了一些资料,表明SV在没有句柄指向该对象后,该对象就会被垃圾回收,但具体什么时间执行不清晰。
看书的时候,这个类比我圈了好几次,就一直想搞明白作者是怎么想的。最后再次感谢您的回复,使我不在纠结类比!
回复 支持 反对

使用道具 举报

发表于 2025-8-22 09:17:05 | 显示全部楼层
本帖最后由 loglong 于 2025-8-22 10:06 编辑


   
Apologize2U 发表于 2025-8-18 14:13
感谢您的回复,我搜集了一些资料,表明SV在没有句柄指向该对象后,该对象就会被垃圾回收,但具体什么时间 ...


不错, 看得很仔细. 想知道SV具体如何做的, 就去看源码, 这个源码都是完全开放的.

https://www.accellera.org/images ... 0.2-2020.3.1.tar.gz

我找了一下, 没找到, 建议别找了.

如果找到了, 告诉我一下, 谢谢.


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /1 下一条


手机版| 小黑屋| 关于我们| 联系我们| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2025-8-30 21:11 , Processed in 0.017075 second(s), 4 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表