是否有紅寶石任何方式來獲得對象的內存地址..在ruby中訪問對象的內存地址?
說..
(I = 5)是可能獲得該對象5的MEM地址..
我一直在嘗試過一段時間才能得到這個..,
任何答案將非常感激......
感謝,
Regards levirg
是否有紅寶石任何方式來獲得對象的內存地址..在ruby中訪問對象的內存地址?
說..
(I = 5)是可能獲得該對象5的MEM地址..
我一直在嘗試過一段時間才能得到這個..,
任何答案將非常感激......
感謝,
Regards levirg
我不知道有確切的地址,但也許你正在尋找像object_id
方法的東西?從其documentation
提取物返回物鏡的整數標識符。
同樣的號碼將所有呼叫返回到ID爲給定的對象,並沒有兩個活動對象將共享一個ID
例子:
> 5.object_id
=> 11
> true.object_id
=> 2
Ruby Memory Validator應該能夠把它拉開,但它不是免費的。
Aman Gupta
patched Joe Damatos但它似乎是
work in progress,我從來沒有在我的機器上運行它。 Joe在他的
blog上有一些關於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
一個Fixnum
的object_id
實際上是由比特移位到左邊,然後設置至少顯著位創建。
5
是0b101
和object_id
爲5
是二進制11
和11
0b1011
是。
4711
是0b0001001001100111
,左移並設置位,你會得到0b0010010011001111
那就是9423這恰好是object_id
以上z
。
This behaviour最有可能是實現特定的,但我不知道這樣處理Fixnum的Ruby實現。
Ruby中至少有三個直接對象,即false
,true
和nil
。
>> false.object_id
=> 0
>> true.object_id
=> 2
>> nil.object_id
=> 4
你究竟想要做什麼?
請記住,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
。
如果您發現自己需要獲取變量的地址,那麼無論您想要做什麼,都可能有一個更簡單的方法。
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)基於軟件驗證爲創建Ruby內存檢查API(http://www.softwareverify.com/ruby/customBuild/index.html)所做的工作。
喬在他的博客中描述過。因此喬的工作也應該返回適當的地址。我並未完全瞭解最新版本的Joe的工作 - 他只告訴我有關第一個版本,而不是最新版本,但是,如果您在Ruby的基礎上跟蹤內存分配,那麼您正在跟蹤地址無論你正在分配什麼東西。
這並不意味着您可以取消引用地址並讀取您希望在該地址找到的數據值。解引用地址將指向基本Ruby對象的內部。 Ruby對象是一個基本對象,然後將附加數據存儲在一起,因此,除非您正在編寫像Ruby Memory Validator或memprof這樣的工具,否則瞭解實際地址並不是非常有用。
我如何知道上面關於Ruby Memory Validator和我們發佈的API?我設計了Ruby Memory Validator。我還編寫了攔截分配內存的Ruby調用的彙編語言位。
你既然標明(埋在評論的地方),你真的只是想了解Ruby的是如何引用的東西,我想工作的事情如下:
在Ruby的C API一個VALUE
代表對象(一nil
,FixNum
或Boolean
)或指向Object
的指針。 VALUE
包含一個3位標記,指示它們是哪一個,並且包含值(對於前3個)或直接存儲器指針(對於Object
)。在Ruby中無法直接獲取VALUE
(我不確定object_id
是相同還是不同)。
請注意,JRuby的運行方式不同。
是的。
從「Fiddling with Ruby’s Fiddle」:
「你可以通過拍攝物體的ID,做一個按位左移得到一個對象的實際指針值這會給你的指針(或內存位置)的紅寶石對象在內存中。「
使用您的i = 5
例如它可以做像這樣:
i = 5
i_ptr_int = i.object_id << 1
=> 22
「In Ruby, why does inspect() print out some kind of object id which is different from what object_id() gives?」有更多的信息關於object_id
,包括簡要介紹了C源代碼,你可能會發現有用的執行標的。
看看「Fiddle」,你可以做一些其他很酷的事情。
不知道爲什麼這個答案不是更多投票,這有助於巨大!如果你有'foo = Class.new',那麼'foo.to_s'返回類似於「#
爲什麼?你想做什麼? – SLaks 2010-03-08 15:13:43