Почему булев примитивный размер Java не определяется?

Спецификация виртуальной машины Java говорит, что там ограничен поддержка булевых типов примитивов.

Нет никаких инструкций по виртуальной машине Java, только выделенных операциям на булевых значениях. Вместо этого выражения на языке программирования Java, которые воздействуют на булевы значения, компилируются для использования значений типа данных int виртуальной машины Java.

Вышеупомянутое подразумевает (хотя я, возможно, неправильно истолковал его), которым тип данных int используется при работе на булевских переменных, но это - конструкция памяти на 32 бита. Учитывая, что булевская переменная только представляет 1 бит информации:

  • Почему байт, или короток, введите не используемый в качестве прокси для булевской переменной вместо интервала?
  • Для какой-либо данной JVM, каков самый надежный способ узнать точно, сколько памяти используется для хранения булева типа?

107
задан Sled 20 October 2016 в 14:07
поделиться

6 ответов

Краткий ответ: да, логические значения обрабатываются как 32-битные объекты, но массивы логических значений используют 1 байт на элемент.

Более длинный ответ: JVM использует 32-битную ячейку стека , используется для хранения локальных переменных, аргументов метода и значений выражений. Примитивы, размер которых меньше 1 ячейки, заполняются, примитивы размером более 32 бит (длинные и двойные) занимают 2 ячейки. Этот метод минимизирует количество кодов операций, но имеет некоторые специфические побочные эффекты (например, необходимость маскировать байты).

Примитивы, хранящиеся в массивах, могут использовать менее 32 битов, и существуют разные коды операций для загрузки и хранения примитива. значения из массива. И для логических, и для байтовых значений используются коды операций baload и bastore, что означает, что логические массивы занимают 1 байт на элемент.

Что касается макета объекта в памяти, это рассматривается в разделе " выровнен по границе 64-битного двойного слова. Скорее всего, он принимает базовый размер слова базового оборудования (32 или 64 бита).


Что касается минимизации объема пространства, используемого логическими значениями: это действительно не проблема для большинства приложений. Фреймы стека (содержащие локальные переменные и аргументы метода) не очень большие, и в большой схеме дискретное логическое значение в объекте тоже не такое большое. Если у вас много объектов с большим количеством логических значений, вы можете использовать битовые поля, которые управляются через ваши геттеры и сеттеры. Однако вы заплатите штраф за процессорное время, который, вероятно, больше, чем штраф за память.

выровнен по границе 64-битного двойного слова. Скорее всего, он принимает базовый размер слова базового оборудования (32 или 64 бита).


Что касается минимизации объема пространства, используемого логическими значениями: это действительно не проблема для большинства приложений. Фреймы стека (содержащие локальные переменные и аргументы метода) не очень большие, и в большой схеме дискретное логическое значение в объекте тоже не такое большое. Если у вас много объектов с большим количеством логических значений, вы можете использовать битовые поля, которые управляются через ваши геттеры и сеттеры. Однако вы заплатите штраф за процессорное время, который, вероятно, больше, чем штраф за память.

Это проблема для большинства приложений. Фреймы стека (содержащие локальные переменные и аргументы метода) не очень большие, и в большой схеме дискретное логическое значение в объекте тоже не такое большое. Если у вас много объектов с большим количеством логических значений, вы можете использовать битовые поля, которые управляются через ваши геттеры и сеттеры. Однако вы заплатите штраф за процессорное время, который, вероятно, больше, чем штраф за память.

Это проблема для большинства приложений. Фреймы стека (содержащие локальные переменные и аргументы метода) не очень большие, и в большой схеме дискретное логическое значение в объекте тоже не такое большое. Если у вас много объектов с большим количеством логических значений, вы можете использовать битовые поля, которые управляются через ваши геттеры и сеттеры. Однако вы заплатите штраф за процессорное время, который, вероятно, больше, чем штраф за память.

112
ответ дан 24 November 2019 в 03:43
поделиться

Я почти уверен, что это сработает:

.card {
    width: 100px;
    height: 150px;
    float: left;
}

.attack, .defence {
    width: 100px;
    height: 75px;
    clear: right;
}

/* Play with height and padding-top of .defence to
get the text to the very bottom */
.attack-top .card .attack {
    float: left;
}
.attack-top .card .defence {
    float: right;
    height: Wpx;
    padding-top: Xpx;
}


/* Play with height and padding-top of .attack to
get the text to the very bottom */
.defence-top .card .attack {
    float: right;
    height: Ypx;
    padding-top: Zpx;
}
.defence-top .card .defence {
    float: left;
}

В вашем описании отсутствуют некоторые детали, поэтому я постараюсь дополнить свои предположения, и вы можете сообщить мне, верны они или нет.

  • Вы сказали «когда карта находится в определенных областях». Я предполагаю, что эти области могут быть представлены различными содержащими классами ( .attack-top и .defence-top , но переименуйте, как считаете нужным).
  • Я при условии, что .card имеет ширину 100 пикселей и высоту 150 пикселей. Если эти значения ширины и высоты неверны, укажите правильные значения и сделайте соответствующие пересчеты. Если .card не имеет фиксированной ширины / высоты, он все равно может работать, но я менее уверен, и вы не сможете заставить нижний текст переместиться в самый низ карточка (чуть ниже верхнего текста).
-10
ответ дан 24 November 2019 в 03:43
поделиться

Одно логическое значение где-то в иерархии наследования может использовать до 8 байтов! Это связано с заполнением. Более подробную информацию можно найти в Сколько памяти используется моим Java-объектом? :

Возвращаясь к вопросу о том, как много логического потребляет, да потребляют хотя бы один байт, но из-за правила выравнивания это может потреблять много Больше. ИМХО интереснее знайте, что логическое [] будет потреблять один байт на запись, а не один бит, плюс некоторые накладные расходы из-за выравнивания и для поле размера массива. Есть алгоритмы графа, где большие поля биты полезны, и вы должны быть знайте, что если вы используете логическое значение [], вы нужно почти ровно в 8 раз больше памяти, чем действительно необходимо (1 байт вместо 1 бита).

7
ответ дан 24 November 2019 в 03:43
поделиться

ЦП работают с определенной длиной типа данных. В случае 32-битных процессоров они имеют длину 32 бита и, следовательно, то, что вы называете int в Java. Все, что ниже или выше, должно быть заполнено или разделено на эту длину, прежде чем ЦП сможет обработать это. Это не займет много времени,

2
ответ дан 24 November 2019 в 03:43
поделиться

Логическое отображение было выполнено с учетом 32-битного ЦП. Значение int имеет 32 бита, поэтому его можно обработать за одну операцию.

Вот решение из Питера Норвига Java IAQ: Часто задаваемые вопросы для измерения размера (с некоторой неточностью):

static Runtime runtime = Runtime.getRuntime();
...
long start, end;
Object obj;
runtime.gc();
start = runtime.freememory();
obj = new Object(); // Or whatever you want to look at
end =  runtime.freememory();
System.out.println("That took " + (start-end) + " bytes.");
3
ответ дан 24 November 2019 в 03:43
поделиться

5-е издание Java in a Nutshell (O'Reilly) говорит, что булевый примитивный тип равен 1 байту. Это может быть неправильно, основываясь на том, что показывает исследование кучи. Интересно, есть ли у большинства JVM проблемы с выделением для переменных менее одного байта?

.
5
ответ дан 24 November 2019 в 03:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: