2011-09-07 50 views
3

回答完大约tracememrecently后,我了解了retracemem?retracemem的帮助和其中的例子让我无法理解。在R中`retracemem`做什么?

retracemem实际上做了什么,为什么?它不会做我认为它会做的事情,即将一个对象指向另一个对象的内存位置,至少据我所知。

我尝试了wizardly调用像.Internal(inspect()),这对我来说没有执行魔法:

> a = 1:10 
> b = a[-1] 
> .Internal(inspect(a)) 
@00000000087AE578 13 INTSXP g0c4 [NAM(2)] (len=10, tl=23336) 1,2,3,4,5,... 
> .Internal(inspect(b)) 
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,... 
> retracemem(b,retracemem(a)) 
> .Internal(inspect(b)) 
@00000000087AE8E8 13 INTSXP g0c4 [NAM(2)] (len=9, tl=7208) 2,3,4,5,6,... 

回答

1

我觉得retracemem()只是让你标记一个变量的副本,这不会产生tracemem声明(如b其上面实际上只是a sans第一个元素的副本),因为它是从相同的源变量派生的,因此您可以继续观察副本/部分副本的传播,并看到它们源自同一个源。

例如,如何做一个的内存被复制/传播:

> A <- 1:10 
> tracemem(A) 
[1] "<0x100a2a978>" 
> B <- A        # Assignment to B doesn't make copy 
> C <- A + 1       # Assignment to C makes copy, alters it 
tracemem[0x100a2a978 -> 0x1020ebbf0]: 
> D <- C + 1       # Assignment to D makes copy, alters it 
tracemem[0x1020ebbf0 -> 0x1020ebc98]: 
> E <- B + 1       # Assignment to E makes copy, alters it 
tracemem[0x100a2a978 -> 0x1020a4208]: 
> F <- A[-1]       # Assignment to F doesn't make copy? 
> G <- F + 1       # Even after altering it? 
> retracemem(F, retracemem(A))   # Hint to R that F is really A derived 
tracemem[<0x100a2a978> -> 0x1009c5910]: 
> G <- F + 1       # Reassignment to G makes copy, alters it 
tracemem[0x1009c5910 -> 0x1020a4748]: 

不过话又说回来,我可能是完全错误的......

+0

我一定要密实。我的一个解释是,分配G时没有消息打印的事实表明F的分配破坏了跟踪。后来,在做第二次G赋值时,tracemem或retracemem似乎给出了相同的后续行为。在这种情况下,它看起来像是一样的。我不确定在这种情况下我们如何从'retracemem'中受益。必须有一些我错过了。 – Iterator

+0

我查看了'do_tracemem()'和'do_retracemem()'的来源。他们之间似乎没有太大的区别。 'do_retracemem()'标记要跟踪的新对象(和'do_tracemem()'一样),然后吐出一行显示新对象和前一个对象之间的链接,然后打印出我假设的是函数调用列表(除非在函数调用中调用'retracemem()',否则不会看到这个函数)。我认为这只是当你想在不安情况下连接内存使用起源的桥梁。 – Zach

+0

我也查看了代码(在'debug.c'中,对不对?),并得出了类似的结论。代码没有记录和未注释时,我喜欢它。虽然这个小小的评论很有趣:'/ * FIXME:...' - 我认为这是一个无害的问题,但它最初引人注目。感谢您抽出宝贵时间来了解这些信息和见解。 – Iterator