Java эквивалент регистра int? - PullRequest
7 голосов
/ 11 февраля 2009

В C я могу выделить регистр для переменной, например:

register int i = 0;

Я знаю, что Java - это интерпретируемый язык, и он находится во многих абстракциях от ЦП.

Существует ли какой-либо механизм, позволяющий даже запрашивать (и если архитектура не позволяет этого, и что), чтобы моя переменная оставалась в регистре вместо перемещения в кэш или основную память?

Я не думаю, что есть какой-либо способ, но я был приятно удивлен прежде.

Спасибо,

Ответы [ 6 ]

18 голосов
/ 12 февраля 2009

register в C не помещает переменную для регистрации. Он просто подсказывает компилятору, что было бы неплохо поместить его в регистр.

В Java нет эквивалента.

6 голосов
/ 12 февраля 2009

Если он используется достаточно быстро, чтобы сделать его регистром int, будет полезно, то компилятор hotspot должен сам это выяснить.

Фактически, компилятор hotspot должен иметь возможность работать лучше, чем компилятор C / C ++, потому что он имеет больше информации для работы. Компиляторы C / C ++ должны догадаться; HotSpot может измерять.

5 голосов
/ 12 февраля 2009

В Java нет эквивалента. Даже в C нет гарантии, что переменная будет сохранена в регистре, и компиляторы могут ее игнорировать.

В Java метод будет интерпретироваться до тех пор, пока JIT горячей точки не будет эвристически определять, что его нужно скомпилировать. Для скомпилированного кода он использует алгоритм раскраски для назначения переменных и временных значений регистрам или записи в / из ОЗУ в случае переполнения регистра.

3 голосов
/ 12 февраля 2009

Я знаю, что Java интерпретируется язык, и много много абстракции от процессора.

Вы в значительной степени ответили на свой вопрос там: -)

А если серьезно, в общем, напишите свой код настолько четко и просто, насколько вы можете, и JVM сделает все возможное, чтобы правильно обработать ваш код.

3 голосов
/ 12 февраля 2009

Нет, на Java нет способа запросить это. Однако есть некоторые вещи, которые вы можете сделать, чтобы предотвратить использование регистра, такие как применение модификатора volatile к переменной-члену.

0 голосов
/ 13 февраля 2009

Вы можете создать аннотацию под названием @register, но JVM определенно ее проигнорирует. например,

@register int i = 0;
...