Например, если у меня есть Enum с двумя случаями, делает ли он больше памяти, чем логическим? Языки: Java, С++
Сколько памяти занимает Enums?
Ответ 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;