2011-12-26 82 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]); 
    } 

} 

不过要小心,引用由值函数传递。