Java: как хранить и извлекать адрес памяти, как в C ++ - PullRequest
4 голосов
/ 26 декабря 2011

Я пришел из 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?Ценю помощь!

Ответы [ 4 ]

7 голосов
/ 26 декабря 2011

Вы можете сделать это в Java, используя Unsafe. Однако это очень плохая идея. Это связано с тем, что адрес объекта может измениться в любое время (с помощью GC). Если вы сохраните адрес, как этот, используйте его позже, он может больше не быть действительным и даже привести к сбою приложения. Если GC считает, что объект не имеет строгой ссылки, он может очистить объект. Когда вы попытаетесь снова сослаться на объект, он может больше не находиться в JVM.

Размер адреса может меняться в зависимости от того, как вы запускаете JVM. 64-битная JVM обычно использует 32-битные ссылки (что может удивить C ++). Вы можете получить это с помощью Unsafe.ADDRESS_SIZE

Я бы использовал Unsafe только для того, чтобы увидеть, что это за адреса, чтобы увидеть, как объекты располагаются в вашем кеше. (Что не очень полезно, так как мало что можно об этом :()

Вполне вероятно, что все, что вы пытаетесь сделать, может быть сделано лучше. Можете ли вы дать нам более подробную информацию?

2 голосов
/ 26 декабря 2011

То, что сказал Петр, верно. Я бы добавил, что вам нужно начать думать в терминах Java, а не в терминах C ++.

Это может помочь вам узнать, что в Java X x = new X(); почти полностью эквивалентно тому, что в C ++ X* x = new X();

0 голосов
/ 26 декабря 2011

В 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]);
    }

}

Будьте осторожны, ссылки передаются по значению в функциях.

0 голосов
/ 26 декабря 2011

Ya.Вы можете сделать это в Java.Но для манипулирования адресом C ++, очевидно, является лучшим выбором.Java не предоставляет такую ​​возможность для легкого манипулирования адресом по соображениям безопасности.

Если вы вызовете hashCode () для любого объекта, он вернет строковое представление адреса любого объекта.

...