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

lev*_*irg 14 ruby

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

说..

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

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

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

谢谢,

关心levirg

d3v*_*vin 14

是.

从" 摆弄Ruby的小提琴 ":

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

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

i = 5
i_ptr_int = i.object_id << 1
=> 22
Run Code Online (Sandbox Code Playgroud)

" 在Ruby中,为什么inspect()打印出一些与object_id()给出的不同的对象id? "有更多的信息object_id,包括对你可能会发现有用的实现的C源的简要介绍.

看看" 小提琴 ",你可以做一些其他很酷的事情.


Jon*_*röm 8

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

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

现在我不太确定他们真的可以.整数存储为一个Fixnum并且Fixnum不是通常的Ruby对象,它只是看起来那样.Ruby使用一个聪明的加速技巧object_id来制作Fixnum对象的immidiate值.该数字实际上存储在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
Run Code Online (Sandbox Code Playgroud)

所述object_id的一个Fixnum实际上是由比特移位到左边,然后设置至少显著位创建.

5is 0b101object_idfor 51111二进制是0b1011.

47110b0001001001100111,左移并设置位,你会得到0b0010010011001111,这是9423这恰好是object_idz以上.

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

还有在Ruby中至少三个直接对象,这就是false,truenil.

>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4
Run Code Online (Sandbox Code Playgroud)


Rom*_*net 5

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

摘自其文档

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


例:

> 5.object_id
=> 11
> true.object_id
=> 2
Run Code Online (Sandbox Code Playgroud)