1、背景
? ? ? ? 指针是C语言的一个重要组成部分,是C语言的核心、精髓所在。用好指针,可以在C语言编程中起到事半功倍的效果:一方面,可以提高程序的编译效率、执行速度以及实现动态的存储分配;另一方面,可是程序更灵活,便于表示各种数据结构,编写高质量的程序。
Systemverilog作为源自C的编程语言,保留了很多与C类似的关键字和特性,但是sv中没有指针,其实,对sv对象的引用是采用对象句柄(object handle),它与C指针概念接近,但又不完全相同。
2、C语言的指针
? ? ? ? ? ?系统内存好比带有编号的小房间,如果需要使用内存就需要得到房间编号。如图,定义一个整型变量i,整型变量需要4个字节,所以编译器为变量i分配的编号为1000~1003。什么是地址呢?地址就是内存区中对每个字节的编号,图中的1000、1001、1002、1003就是地址
?进一步说明,看下图,所示的1000、1004等就是内存单元的地址,而0、1就是内存单元的内容,换种说法就是基本整型变量i在内存中的地址从1000开始。因为基本整型占4字节,所以变量j在内存中的起始地址为1004,变量i的内容为0,j的内容为2。
???????
?
指针是什么呢?这里仅将指针看作是内存的一个地址,多数情况下,这个地址是内存中的另一个变量的位置,如下图所示。在程序中定义一个变量,在进行编译时就会给改变量在内存中分配一个地址,通过访问这个地址可以找到所需的变量,这个变量的地址成为该变量的指针。地址1000是变量i的指针。
?变量与指针:变量的地址是变量(i)和指针(p)二者之间连接的纽带。将变量i的地址存放到指针变量p中,p就指向i,其关系如下:
2、SV中的句柄
?总感觉SV绿皮书里没有把句柄讲的很明白,了解了C中指针的意义,有利于理解sv中的句柄。句柄的基本功能跟指针一样,都是用来指向具体对象,及句柄本身的值就是对象所占内存空间的起始地址。
句柄与指针相比,能力有限,区别主要体现在以下几方面:
句柄与指针区别
1 | C指针可以会指向任意类型的数据对象,而句柄只能指向类例化出来的对象。在SV中,如果需要在函数中引用外部变量,则可以在参数列表中给对应参数加上ref关键字。 | 2 | C指针允许做数值计算,而句柄不能。指针很灵活,程序员可以修改它的值,比如在索引数组元素的时候,是可以通过递增数组指针的值来达到这一目的的。SV中句柄显然不能这么干,只能老老实实用下标来索引数组。 | 3 | C指针能够灵活的类型转换(Casting),而SV句柄则被严格限制。在SV中,句柄类型转换需要用内建函数$cast来实现动态转换。而且要让对象指针casting成功,除了同类型相互casting,一般只有一种结果,即父类句柄指向子类对象。casting的成功与否,可以用来判断类型是否正确,这也是工作中经常采用的方法。 | 4 | SV中没有被句柄指向的对象会被自动垃圾回收(garbage collected),而没有被C指针指向的数据对象需要程序员自己做内存释放和回收。这一点也是很多在介绍SV特性的时候会提到的点。 |
|