访问ruby中的对象内存地址..?

有没有办法在ruby中获取对象的内存地址..

说..

(i = 5)是可以得到该对象的mem地址5 ..

一段时间以来,我一直在尝试这个……

任何答案都会非常感激……

谢谢,

关心levirg

是。

从“ 摆弄Ruby的小提琴 ”:

“你可以通过获取对象id来获取对象的实际指针值,然后按位向左移动。这将为你提供内存中ruby对象的指针(或内存位置)。”

使用你的i = 5例子可以这样做:

 i = 5 i_ptr_int = i.object_id << 1 => 22 

“ 在Ruby中,为什么inspect()打印出某种与object_id()不同的对象id? ”有更多关于object_id信息,包括对实现的C源的简要介绍,你可能会发现它有用。

看看“ 小提琴 ”,你可以做一些其他很酷的事情。

Ruby Memory Validator应该可以关闭它,但它不是免费的。

Aman Gupta 修补了 Joe Damatos memprof,但这似乎是一项正在进行的工作 ,我从来没有让它在我的机器上运行。 Joe在他的博客上有关于memprof和其他低级别内容的几篇非常好的post。

现在我不太确定他们真的可以。 整数存储为FixnumFixnum不是通常的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 

Fixnumobject_id实际上是通过向左移位然后设置最低有效位来创建的。

50b101object_id11 ,二进制110b1011

47110b0001001001100111 ,向左移动并设置该位,你得到0b0010010011001111 ,那就是9423,恰好是上面zobject_id

这种行为很可能是特定于实现的,但我不知道Ruby实现不能以这种方式处理Fixnum。

Ruby中至少还有三个直接对象,它们是falsetruenil

 >> false.object_id => 0 >> true.object_id => 2 >> nil.object_id => 4 

我不知道有一个确切地址的方法,但也许你正在寻找像object_id方法的东西?

摘自其文档

返回obj的整数标识符。
对于给定对象的所有id调用都将返回相同的数字,并且没有两个活动对象将共享id


例:

 > 5.object_id => 11 > true.object_id => 2 

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调用。

你究竟想做什么?

请记住,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 

即使ab是单独的变量,它们也是对相同底层数据的引用,并且具有相同的object_id

如果你发现自己需要获取变量的地址,那么对于你想要做的事情,可能有一种更简单的方法。

既然你指出(埋在某个地方的评论中)你真的只是想了解Ruby如何引用事物,我认为事情的工作方式如下:

Ruby的C api中的VALUE表示一个对象(一个nil ,一个FixNum或一个Boolean )或一个指向Object的指针。 VALUE包含一个3位标记,指示它们中的哪一个,并包含值(对于前3个)或直接存储器指针(对于Object )。 没有办法直接在Ruby中获取VALUE ,(我不确定object_id是相同还是不同。)

请注意,JRuby的运行方式不同。