Java-эквивалент регистра int?
-
22-08-2019 - |
Вопрос
В C я могу выделить регистр для переменной, например:
register int i = 0;
Я знаю, что Java — это интерпретируемый язык, и он находится далеко от процессора.
Существует ли какой-либо механизм, позволяющий даже запросить (а если архитектура этого не позволяет, ну и что), чтобы моя переменная оставалась в регистре, а не перемещалась в кеш или основную память?
Я не думаю, что есть какой-либо способ, но раньше я был приятно удивлен.
Спасибо,
Решение
Нет, на Java невозможно запросить это.Однако есть некоторые вещи, которые вы можете сделать, чтобы предотвратить использование регистра, например, применить volatile
модификатор переменной-члена.
Другие советы
register
в C не регистрируется переменная.Это просто дает компилятору подсказку, что, вероятно, было бы неплохо поместить его в регистр.
В Java нет эквивалента.
Если он используется достаточно быстро и имеет смысл сделать его регистром int, то компилятор горячей точки должен сам это выяснить.
Фактически, компилятор горячей точки должен выполнять свою работу лучше, чем компилятор C/C++, поскольку у него больше информации для работы.Компиляторам C/C++ приходится гадать;HotSpot может измерять.
В Java нет эквивалента.Даже в C нет гарантии, что переменная будет сохранена в регистре, и компиляторы могут ее игнорировать.
В Java метод будет интерпретироваться до тех пор, пока JIT горячей точки эвристически не определит, что его необходимо скомпилировать.Для скомпилированного кода он использует алгоритм раскраски для назначения переменных и временных значений регистрам или записи в/из ОЗУ в случае переполнения регистра.
Я знаю, что Java - это интерпретированный язык, и это много абстракций вдали от процессора.
Вы в значительной степени ответили на свой вопрос там :-)
А если серьезно, в общем, пишите свой код настолько ясно и просто, насколько это возможно, и JVM сделает все возможное, чтобы правильно обработать ваш код.
Вы можете создать аннотацию с именем @register, но JVM обязательно ее проигнорирует.например
@register int i = 0;