2011-12-26 141 views
3

我來自C++背景。在C++中,我可以將一個內存地址存儲在全局數組中,並在以後重新使用它。例如,假設我有兩個類X,Y和我創建了兩個對象x,y。Java:如何在C++中存儲和檢索內存地址

uint32_t StoreAddresses[2]; 

我寫:

X * x = new X(); 
Y * y = new Y(); 
StoreAdresses[0] = (uint32t *) x; //for example, 0x12345678 
StoreAdresses[1] = (uint32t *) y; //for example, 0x12345698 

Anywhere的我的程序,我可以檢索寫在存儲器中的數據,通過調用:作爲全局陣列StoreAddresses [2]被定義

X * stored_x = (X*)StoreAdresses[0]; 
Y * stored_y = (Y*)StoreAdresses[1]; 

我怎樣才能在Java中實現? 感謝幫助!

+1

Java和C/C++之間的原理差異之一是Java限制了程序員使用和濫用內存的能力。我想你可以用一個字節數組來模擬這個(或者像Peter Lawrey所說的那樣,使用'unsafe',但是對於他來說就是1+),但是更好的做法是讓你學習Java的方法並且使你的編碼適應它的優點,不是它的弱點。 – 2011-12-26 12:14:48

+0

與@HovercraftFullOfEels一致 - 爲了實現你想要做的事情,你應該將'X'和'Y'的引用存儲在一個靜態字段中,而不是用內存地址。 – Chii 2011-12-26 12:19:59

+0

真正的問題是:你爲什麼要這樣做 – 2011-12-26 12:21:37

回答

6

您可以使用不安全的方式在Java中執行此操作。然而這是一個非常糟糕的主意。這是因爲對象的地址可以隨時更改(通過GC)如果您將地址存儲爲這樣的地址,稍後再使用它可能無效,甚至導致應用程序崩潰。如果GC認爲一個對象沒有強大的參考,它可能會清理該對象。當您嘗試再次引用該對象時,它可能不再位於JVM中。

地址的大小可以根據啓動JVM的方式而改變。一個64位的JVM通常使用32位引用(這可能是來自C++的一個驚喜)你可以得到這個與Unsafe.ADDRESS_SIZE

我只會使用不安全來看看地址是如何看待如何佈局對象您的緩存。 (是不是非常有用,因爲沒有太多可以吧:()

很可能什麼都你想可以做一個更好的方法。你可以給我們更多的細節?

+0

彼得你好。感謝您提供詳盡的答案。我之所以這麼做是因爲我在使用繼承時在代碼中犯了一個簡單的錯誤......我有一個基類和4個子類。儘管我在基類中宣佈了我原來的公共對象,但是我誤將其中一個孩子重新命名了。所以,在所有其他類中的引用是null :(這就是爲什麼我想到了C++技巧。現在我已經在基類中定義了它,問題已經解決了!順便說一下,C++內存操作在我的商業應用程序中完全適用於不同的arch W/O缺陷再次感謝輸入! – goseib 2011-12-26 16:20:49

+0

它在C++中起作用,因爲當你使用它們時你的指針不會被改變 – 2011-12-26 20:59:39

2

說什麼彼得是正確的。我想補充一點,你需要開始考慮在Java方面,而不是在C++方面。

它可以幫助你知道,在Java中X x = new X();幾乎完全等同於什麼在C++中X* x = new X();

+1

用於Java語言思維的+1 – 2011-12-26 12:21:24

+0

嗨邁克,我知道所有這些東西。請閱讀我對彼得的評論:) – goseib 2011-12-26 16:22:59

+0

好的,我明白了! – 2011-12-26 18:14:27

0

Ya。 您可以使用Java來完成這項工作。 但是,對於操作地址,C++顯然是更好的選擇。由於安全原因,Java不提供該功能來輕鬆操作地址。

如果您在任何對象上調用hashCode(),它將返回任何對象的地址的字符串表示形式。

+0

謝謝Mukherjee。我也可以使用toString並讀取'@'符號後面的子字符串。 – goseib 2011-12-26 16:23:59

+0

歡迎您goseib .. – Sabya 2011-12-26 16:37:01

0

在java中,您可以使用對象引用。有沒有空或積分球,但由於每個對象從Object繼承,您可以用投對象的引用來

import java.lang.*; 

class test { 

    static Object[] StoreObjectRefs = new Object[2]; 

    public static void main(String args[]) 
    { 
     Integer x = new Integer(1); 
     Float y = new Float(2.0); 

     StoreObjectRefs[0] = (Object) x; 
     StoreObjectRefs[1] = (Object) y; 

     System.out.println((Integer)StoreObjectRefs[0]+(Float)StoreObjectRefs[1]); 
    } 

} 

不過要小心,引用由值函數傳遞。