Сколько памяти Перечисления берут?

[ совпадает с командой test, которая позволяет вам проверять определенные вещи. Попробуйте help test, чтобы узнать, что такое флаги. Вещи, которые следует соблюдать осторожно, - это пробелы - [ нуждается в пробеле после него.

47
задан Jonny Buchanan 27 September 2008 в 13:11
поделиться

12 ответов

В Java, enum полноценный класс :

типы перечисления языка программирования Java намного более мощны, чем их дубликаты на других языках. Перечислимое объявление определяет класс (названный перечислимым типом). Тело класса Enum может включать методы и другие поля.

для наблюдения фактического размера каждого enum, давайте сделаем фактическое enum и исследуйте содержание class файл, который он создает.

Скажем, у нас есть следующий Constants класс Enum:

public enum Constants {
  ONE,
  TWO,
  THREE;
}

Компиляция вышеупомянутое enum и разборка получающегося class файл с javap дает следующее:

Compiled from "Constants.java"
public final class Constants extends java.lang.Enum{
    public static final Constants ONE;
    public static final Constants TWO;
    public static final Constants THREE;
    public static Constants[] values();
    public static Constants valueOf(java.lang.String);
    static {};
}

дизассемблирование показывает, что то каждое поле enum является экземпляром Constants enum класс. (Дальнейший анализ с [1 113] покажет, что каждое поле инициализируется путем создания нового объекта путем вызова new Constants(String) конструктор в статическом блоке инициализации.)

Поэтому мы можем сказать, что каждый enum поле, которое мы создаем, будет, по крайней мере, так же как издержки создания объекта в JVM.

44
ответ дан coobird 7 November 2019 в 23:20
поделиться

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

17
ответ дан thenickdude 7 November 2019 в 23:20
поделиться

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

4
ответ дан Jeff Hubbard 7 November 2019 в 23:20
поделиться

Вы только волновались бы об этом при хранении больших количеств перечислений. Для Java можно быть в состоянии использовать EnumSet в некоторых случаях. Это использует немного вектора внутренне, который является очень пространством, эффективным и быстрым.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html

8
ответ дан Tom 7 November 2019 в 23:20
поделиться

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

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

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

7
ответ дан Mike Dimmick 7 November 2019 в 23:20
поделиться

В C++ ISO нет никакого обязательства для перечисления, чтобы быть больше, чем его самый большой перечислитель требует. В частности, перечисление {ПРАВДА, ЛОЖЬ} может иметь sizeof (1) даже когда sizeof (bool) == sizeof (интервал). Нет просто никакого требования. Некоторые компиляторы делают перечисления тем же размером как интервал. Это - функция компилятора, которая позволяется, потому что стандарт только налагает минимум. Другие компиляторы используют расширения для управления размером перечисления.

3
ответ дан MSalters 7 November 2019 в 23:20
поделиться
printf("%d", sizeof(enum));
1
ответ дан Patrick 7 November 2019 в 23:20
поделиться

В C++ перечисление обычно является тем же размером как int. Это сказало, что компиляторам весьма свойственно обеспечить переключатель командной строки, чтобы позволить размеру перечисления быть установленным на самый маленький размер, который соответствует диапазону определенных значений.

1
ответ дан Andrew Edgecombe 7 November 2019 в 23:20
поделиться

Если Ваше перечисление будет когда-либо иметь только два случая, действительно использование булевской переменной вместо этого могло бы быть лучшей идеей (емкость памяти, производительность, использование/логика), еще больше в Java.
, Если Вы задаетесь вопросом о стоимости памяти, она могла бы подразумевать, что Вы планируете использовать партию их. В Java можно использовать класс BitSet, или в меньшем масштабе, на обоих языках, можно управлять битами с битовыми операциями.

0
ответ дан PhiLho 7 November 2019 в 23:20
поделиться

Нет, перечисление обычно является тем же размером как интервал, то же как булевская переменная.

0
ответ дан Cody Brocious 7 November 2019 в 23:20
поделиться

sizeof (перечисление) зависит от того, что Вы имеете в перечислении. Я недавно пытался найти размер ArrayList () с параметрическими усилителями конструктора по умолчанию и никакими объектами сохраненным внутри (что означает, что возможность сохранить равняется 10). Оказалось, что ArrayList не является слишком большим < 100 байтов.

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

BR,
~A

0
ответ дан anjanb 7 November 2019 в 23:20
поделиться

В C/C++ перечисление будет тем же размером как интервал

С gcc, который можно добавить атрибут ((упакованный)) к перечислимому определению, чтобы заставить его взять минимальное место. Если самое большое значение в перечислении является < 256 это будет один байт, два байта, если самое большое значение будет < 65536, и т.д.

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;
0
ответ дан DGentry 7 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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