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

FY

Johnson 's Blog

 
 
 

日志

 
 

PerlGuts Illustrated (3 AV)  

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

  下载LOFTER 我的照片书  |

AV

数组,结构如图所示:


字段ALLOC 指向实际分配的SV 数组的开头地址。

字段ARRAY 指向数组本身的开头地址,由于数组的改变,这个地址比起实际分配的地址,可能会产生一定的偏移。

字段FILL 指向数组本身最后一个位置的偏移。

字段MAX 指向分配的SV 数组最后一个位置的偏移。

  1. C:\>perl -MDevel::Peek -e "@a = 1..2; Dump \@a"  
  2. SV = RV(0x299120) at 0x299114  
  3.   REFCNT = 1  
  4.   FLAGS = (TEMP,ROK)  
  5.   RV = 0x182a9cc  
  6.   SV = PVAV(0x29a03c) at 0x182a9cc  
  7.     REFCNT = 2  
  8.     FLAGS = ()  
  9.     ARRAY = 0x1852984  
  10.     FILL = 1  (数组最后一个元素index为1)  
  11.     MAX = 3   (分配的数组空间最大index为3,说明还有剩余空间来分配)  
  12.     ARYLEN = 0x0  
  13.     FLAGS = (REAL)  
  14.     Elt No. 0  
  15.     SV = IV(0x299220) at 0x299224  
  16.       REFCNT = 1  
  17.       FLAGS = (IOK,pIOK)  
  18.       IV = 1  
  19.     Elt No. 1  
  20.     SV = IV(0x299230) at 0x299234  
  21.       REFCNT = 1  
  22.       FLAGS = (IOK,pIOK)  
  23.       IV = 2  

shift pop 操作可以通过调节ARRAY FILL MAX来完成。

  1. C:\>perl -MDevel::Peek -e "@a = 0..3; Dump \@a; shift @a; pop @a; Dump \@a"  
  2. SV = RV(0x299130) at 0x299124  
  3.   REFCNT = 1  
  4.   FLAGS = (TEMP,ROK)  
  5.   RV = 0x182aa14  
  6.   SV = PVAV(0x29a04c) at 0x182aa14  
  7.     REFCNT = 2  
  8.     FLAGS = ()  
  9.     ARRAY = 0x1824afc  
  10.     FILL = 3  
  11.     MAX = 3  
  12.     ARYLEN = 0x0  
  13.     FLAGS = (REAL)  
  14.     Elt No. 0  
  15.     SV = IV(0x299280) at 0x299284  
  16.       REFCNT = 1  
  17.       FLAGS = (IOK,pIOK)  
  18.       IV = 0  
  19. ...  
  20. SV = RV(0x2991e0) at 0x2991d4  
  21.   REFCNT = 1  
  22.   FLAGS = (TEMP,ROK)  
  23.   RV = 0x182aa14  
  24.   SV = PVAV(0x29a04c) at 0x182aa14  
  25.     REFCNT = 2  
  26.     FLAGS = ()  
  27.     ARRAY = 0x1824b00 (offset=1)  
  28.     ALLOC = 0x1824afc  
  29.     FILL = 1  
  30.     MAX = 2  
  31.     ARYLEN = 0x0  
  32.     FLAGS = (REAL)  
  33.     Elt No. 0  
  34.     SV = IV(0x299200) at 0x299204  
  35.       REFCNT = 1  
  36.       FLAGS = (IOK,pIOK)  
  37.       IV = 1  
  38.     Elt No. 1  
  39.     SV = IV(0x182aa40) at 0x182aa44  
  40.       REFCNT = 1  
  41.       FLAGS = (IOK,pIOK)  
  42.       IV = 2  
FLAGS REAL 表示所有内部的SV都需要有自己的引用计数,一般的AV 都是使用这个标记。

FLAGS REIFY 表示这个数组不是一个REAL 类型的,当这个数组发生改变的时候需要置为REAL,默认参数@_ 都是使用REIFY 标记。

  评论这张
 
阅读(118)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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