Подтвердить что ты не робот

Сколько памяти занимает Enums?

Например, если у меня есть Enum с двумя случаями, делает ли он больше памяти, чем логическим? Языки: Java, С++

4b9b3361

Ответ 1

В 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. (Дальнейший анализ с помощью javap покажет, что каждое поле инициализируется путем создания нового объекта путем вызова конструктора new Constants(String) в статическом блоке инициализации.)

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

Ответ 2

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

Ответ 3

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

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

В ISO С++ нет требования, чтобы перечисление было больше, чем требуется его наибольший перечислитель. В частности, перечисление {TRUE, FALSE} может иметь sizeof (1), даже если sizeof (bool) == sizeof (int). Просто нет требования. Некоторые компиляторы делают перечисления того же размера, что и int. Это функция компилятора, которая разрешена, поскольку стандарт вводит минимум. Другие компиляторы используют расширения для управления размером перечисления.

Ответ 7

printf("%d", sizeof(enum));

Ответ 8

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

Ответ 9

Нет, перечисление обычно имеет тот же размер, что и int, такой же, как и логический.

Ответ 10

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

Ответ 11

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

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

BR,
~ А

Ответ 12

В C/С++ перечисление будет иметь тот же размер, что и int.

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

typedef enum {
    MY_ENUM0,
    MY_ENUM1,
    MY_ENUM2,
    MY_ENUM3,
    MY_ENUM4,
    MY_ENUM5
} __attribute__((packed)) myEnum_e;