注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

FY

Johnson 's Blog

 
 
 

日志

 
 

PerlGuts Illustrated (2 SV)  

2012-08-06 21:56:28|  分类: perl |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

_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见下边具体示例。

  1. C:\>perl -MDevel::Peek -e "Dump $a"  
  2. SV = NULL(0x0) at 0x182a9fc  
  3.   REFCNT = 1  
  4.   FLAGS = ()  
  5.   
  6. C:\>perl -MDevel::Peek -e "Dump \$a"  
  7. SV = RV(0x299158) at 0x29914c  
  8.   REFCNT = 1  
  9.   FLAGS = (TEMP,ROK)  
  10.   RV = 0x182a9fc  
  11.   SV = NULL(0x0) at 0x182a9fc  
  12.     REFCNT = 2  
  13.     FLAGS = ()  


SvIV and SvNV

整数和小树,结构如图所示:


  1. C:\>perl -MDevel::Peek -e "$a = 123; Dump $a"  
  2. SV = IV(0x182aa20) at 0x182aa24  
  3.   REFCNT = 1  
  4.   FLAGS = (IOK,pIOK)  
  5.   IV = 123  
  6.   
  7. C:\>perl -MDevel::Peek -e "$a = 123.9; Dump $a"  
  8. SV = NV(0x184882c) at 0x182aa2c  
  9.   REFCNT = 1  
  10.   FLAGS = (NOK,pNOK)  
  11.   NV = 123.9  

SvPV

字符串,结构如图所示:


除了SV以外,额外的结构xpv被分配,它包含三部分:

PVX 指向实际的字符串。
CUR 标记字符串的长度,PVX+CUR 处的字符应该为'\0',标记字符串的结束。
LEN 标记内存分配给char * 的长度,以4为增量。

POK标记表示PVX所指向的内存包含有效字符串,否则所包含的字符串无效。

  1. C:\>perl -MDevel::Peek -e "$a = 't'; Dump $a"  
  2. SV = PV(0x296fec) at 0x182aa24  
  3.   REFCNT = 1  
  4.   FLAGS = (POK,pPOK)  
  5.   PV = 0x182472c "t"\0  
  6.   CUR = 1  
  7.   LEN = 4  
  8.   
  9. C:\>perl -MDevel::Peek -e "$a = 'test'; Dump $a"  
  10. SV = PV(0x296fec) at 0x182aa2c  
  11.   REFCNT = 1  
  12.   FLAGS = (POK,pPOK)  
  13.   PV = 0x182466c "test"\0  
  14.   CUR = 4  
  15.   LEN = 8 (随着长度增加,以4为增量)  
  16.   
  17. C:\>perl -MDevel::Peek -e "$a = 'test'; $a = undef; Dump $a"  
  18. SV = PV(0x296ffc) at 0x182aa34  
  19.   REFCNT = 1  
  20.   FLAGS = ()  (包含字符串,但是无效)  
  21.   PV = 0x1824674 "test"\0  
  22.   CUR = 4  
  23.   LEN = 8  

SvOOK

为了提高移除字符串开头字符的速度,使用了OOK标记,IVX存储着偏移量,结构如图所示:


  1. C:\>perl -MDevel::Peek -e "$a = 'xtesting'; $a=~s/.//; Dump $a"  
  2. SV = PVIV(0x182005c) at 0x182aa4c  
  3.   REFCNT = 1  
  4.   FLAGS = (POK,OOK,pPOK)  
  5.   IV = 1  (OFFSET)  
  6.   PV = 0x182467d ( "x" . ) "testing"\0  
  7.   CUR = 7  
  8.   LEN = 11  

SvPVIV and SvPVNV

类似字符串,但是PVIV储存了额外的整数或者小数信息,可以根据flag直接进行数学运算,结构如图所示:


  1. C:\>perl -MDevel::Peek -e "$a = '123.0'; 0+$a; Dump $a"  
  2. SV = PVNV(0x29838c) at 0x182aa34  
  3.   REFCNT = 1  
  4.   FLAGS = (IOK,NOK,POK,pIOK,pNOK,pPOK)  
  5.   IV = 123  
  6.   NV = 123  
  7.   PV = 0x1824674 "123.0"\0  
  8.   CUR = 5  
  9.   LEN = 8  
  10.   
  11. C:\>perl -MDevel::Peek -e "$a = '123testing'; 0+$a; Dump $a"  
  12. SV = PVNV(0x298394) at 0x182aa34  
  13.   REFCNT = 1  
  14.   FLAGS = (POK,pIOK,pNOK,pPOK)  
  15.   IV = 123  
  16.   NV = 123  
  17.   PV = 0x1824674 "123testing"\0  
  18.   CUR = 10  
  19.   LEN = 12  

SvRV

类似指针,指向任意其他结构,结构如图所示:

  1. C:\>perl -MDevel::Peek -e "$a = '123testing'; $b = \$a ; Dump $b"  
  2. SV = RV(0x182ab68) at 0x182ab5c  
  3.   REFCNT = 1  
  4.   FLAGS = (ROK)  
  5.   RV = 0x182aa4c  
  6.   SV = PV(0x296ffc) at 0x182aa4c  
  7.     REFCNT = 2  
  8.     FLAGS = (POK,pPOK)  
  9.     PV = 0x182467c "123testing"\0  
  10.     CUR = 10  
  11.     LEN = 12  
http://blog.csdn.net/ustbhacker/article/details/7814175
  评论这张
 
阅读(119)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018