ruby中有没有办法获取对象的内存地址..
说..
(i = 5)可以获得该对象的mem地址5 ..
我一直想尝试这个......,
任何答案都会非常感激......
感谢,
关心levirg
答案 0 :(得分:13)
是
来自" Fiddling with Ruby’s Fiddle":
"您可以通过获取对象id并向左逐位移位来获取对象的实际指针值。这将为您提供内存中ruby对象的指针(或内存位置)。"
使用i = 5
的示例,可以这样做:
i = 5
i_ptr_int = i.object_id << 1
=> 22
&#34; In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives?&#34;有关object_id
的更多信息,包括对您可能会发现有用的实施的C源的简要介绍。
看看&#34; Fiddle&#34;对于其他一些你可以做的很酷的事情。
答案 1 :(得分:8)
Ruby Memory Validator应该可以将其关闭,但它不是免费的。
Aman Gupta patched Joe Damatos memprof但似乎是work in progress我从来没有让它在我的机器上运行。乔在他的blog上有关于memprof和其他低级别内容的几篇非常好的帖子。
现在我不太确定他们真的可以。整数存储为Fixnum
,而Fixnum
不是通常的Ruby对象,它只是看起来那样。 Ruby使用object_id
的聪明加速技巧使Fixnum
个对象成为临时值。该号码实际上存储在object_id
本身。这就是为什么包含相同值的两个不同Fixnum具有相同的object_id
。
>> x=5
=> 5
>> y=5
=> 5
>> x.object_id
=> 11
>> y.object_id
=> 11
>> z=4711
=> 4711
>> z.object_id
=> 9423
object_id
的{{1}}实际上是通过向左移位然后设置最低有效位来创建的。
Fixnum
为5
,0b101
的{{1}}为object_id
,二进制为5
为11
。
11
为0b1011
,向左移动并设置该位,然后您获得4711
,这就是9423,恰好是上面0b0001001001100111
的{{1}}
This behaviour很可能是特定于实现的,但我不知道Ruby实现不能以这种方式处理Fixnum。
Ruby中至少还有三个直接对象,即0b0010010011001111
,object_id
和z
。
false
答案 2 :(得分:5)
我不知道如何获得确切地址,但也许您正在寻找类似object_id
方法的内容?
返回obj的整数标识符 对于给定对象的所有id调用都将返回相同的数字,并且没有两个活动对象将共享id
示例:
> 5.object_id
=> 11
> true.object_id
=> 2
答案 3 :(得分:1)
Ruby Memory Validator确实为您提供了对象的内存地址。
Joe Damato的工作(http://timetobleed.com/plugging-ruby-memory-leaks-heapstack-dump-patches-to-help-take-out-the-trash)和(http://timetobleed.com/memprof-a-ruby-level-memory-profiler)基于Software Verification为创建Ruby内存检查API(http://www.softwareverify.com/ruby/customBuild/index.html)所做的工作。
乔在他的博客上描述了这一点。因此Joe的工作也应该返回适当的地址。我没有完全掌握最新版本的Joe的工作 - 他只告诉我第一个版本,而不是最新版本,但是,如果你在Ruby的基础上跟踪内存分配,你正在跟踪地址包含你正在分配的任何东西的对象。这并不意味着您可以取消引用地址并读取您希望在该地址找到的数据值。取消引用该地址将指向基本Ruby对象的内部。 Ruby对象是一个基本对象,然后存储其他数据,因此除非您正在编写Ruby Memory Validator或memprof等工具,否则了解实际地址并不是很有用。
我如何知道上面有关Ruby Memory Validator和我们发布的API的内容?我设计了Ruby Memory Validator。我还编写了汇编语言位来拦截分配内存的Ruby调用。
答案 4 :(得分:0)
你究竟想做什么?
请记住,Ruby对象与C或C ++等语言中的变量不直接相似。例如:
a = "foo"
b = a
b[2] = 'b'
b
=> "fob"
a
=> "fob"
a == b
=> true
a.object_id
=> 23924940
b.object_id
=> 23924940
a.object_id == b.object_id
=> true
即使a
和b
是单独的变量,它们也是对相同基础数据的引用,并且具有相同的object_id
。
如果您发现自己需要获取变量的地址,那么可能更容易实现您想要做的任何事情。
答案 5 :(得分:0)
既然你指出(埋在某个地方的评论中)你真的只是想了解Ruby如何引用事物,我认为事情的工作原理如下:
Ruby的C api中的VALUE
代表一个对象(nil
,FixNum
或Boolean
)或指向Object
的指针。 VALUE
包含一个3位标记,指示它们中的哪一个,并包含值(对于前3个)或直接内存指针(对于Object
)。没有办法直接在Ruby中VALUE
,(我不确定object_id
是否相同或不同。)
请注意,JRuby的运作方式不同。
答案 6 :(得分:0)
在Ruby中,每个创建的对象都有一个关联的Symbol,它们持有该对象的真实标识符,并以冒号(:)作为前缀,因此,要检索对象的内存地址,您需要调用{{ 1}}方法,对象的Symbol而不是对象本身。 示例:
object_id