【发布时间】:2011-12-26 12:08:40
【问题描述】:
我来自 C++ 背景。在 C++ 中,我可以将刚刚新建的内存地址存储在全局数组中,然后再使用它。例如,假设我有两个类 X、Y,我创建了两个对象 x、y。全局数组 StoreAddresses[2] 定义为:
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
在我的程序的任何地方,我都可以通过调用来检索写入内存中的数据:
X * stored_x = (X*)StoreAdresses[0];
Y * stored_y = (Y*)StoreAdresses[1];
如何在 Java 中实现这一点? 感谢您的帮助!
【问题讨论】:
-
Java 和 C/C++ 的主要区别之一是 Java 限制了程序员使用和滥用内存的能力。我想您可以使用字节数组来模拟这一点(或使用
unsafe,正如 Peter Lawrey 所说——对他来说是 1+),但更好的是让您学习 Java 的方法并根据其优势调整您的编码,不是它的弱点。 -
同意@HovercraftFullOfEels - 为了实现您似乎想要做的事情,您应该将
X和Y的引用存储在静态字段中,而不是乱用内存地址。 -
真正的问题是:你为什么要这样做
-
我敢打赌,您需要的是几个大字节数组来进行直接字节操作。如果您不需要直接的字节操作不要访问内存!!访问您的对象!在 Java 中,您总是操纵引用。所以写
X x = new X(); x.doThis()等价于C++X* x = new X(); x->doThis()。始终考虑对象指针和箭头访问。 -
感谢您发帖。我将在下面回复彼得的帖子。我已经不再使用 Unsafe。
标签: java jvm memory-address unsafe