PerlGuts Illustrated (2 SV)
_SV_HEAD and struct sv
下面来看一下最简单的类型struct sv,代表了SV,GV,CV,AV,HV,IO的通用结构。如下图所示:
第一个字段Any可以指向任意结构,除了RV,所有的其他类型都是由Any指向的附加数据来实现。
第二个字段REFCNT表明了有多少pointers引用了这个object。初始置为1,当有pointers指向它或者被销毁的时候,这个值需要相应的加1或者减1,当值为0的时候,内存释放。
第三个字段包含了FLAGS & TYPE,是一个32 bit unsigned int。如下图:
常见的flags见下边具体示例。
除了SV以外,额外的结构xpv被分配,它包含三部分:
PVX 指向实际的字符串。
CUR 标记字符串的长度,PVX+CUR 处的字符应该为'\0',标记字符串的结束。
LEN 标记内存分配给char * 的长度,以4为增量。POK标记表示PVX所指向的内存包含有效字符串,否则所包含的字符串无效。
C:\>perl -MDevel::Peek -e "$a = '123testing'; $b = \$a ; Dump $b"SV = RV(0x182ab68) at 0x182ab5c REFCNT = 1 FLAGS = (ROK) RV = 0x182aa4c SV = PV(0x296ffc) at 0x182aa4c REFCNT = 2 FLAGS = (POK,pPOK) PV = 0x182467c "123testing"\0 CUR = 10 LEN = 12