[
совпадает с командой test
, которая позволяет вам проверять определенные вещи. Попробуйте help test
, чтобы узнать, что такое флаги. Вещи, которые следует соблюдать осторожно, - это пробелы - [
нуждается в пробеле после него.
В 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.
В Java должен только быть один экземпляр каждого из значений Вашего перечисления в памяти. Ссылка на перечисление тогда требует только устройства хранения данных для той ссылки. Проверка значения перечисления так же эффективна как любое другое ссылочное сравнение.
В Java потребовалось бы больше памяти. В C++ это не взяло бы памяти, чем необходимый для константы того же типа (это оценено во время компиляции и не имеет никакого остаточного значения во времени выполнения). В C++ это означает, что тип по умолчанию для перечисления займет то же место как интервал
Вы только волновались бы об этом при хранении больших количеств перечислений. Для Java можно быть в состоянии использовать EnumSet в некоторых случаях. Это использует немного вектора внутренне, который является очень пространством, эффективным и быстрым.
http://java.sun.com/j2se/1.5.0/docs/api/java/util/EnumSet.html
bool
мог бы быть реализован как единственный байт, но обычно в структуре он будет окружен другими элементами, которые имеют требования выравнивания, которые означали бы, что булевская переменная будет эффективно занимать, по крайней мере, столько же места сколько int
.
современные процессоры загружают данные из оперативной памяти в целом строка кэша, 64 байта. Различие между загрузкой одного байта от кэша L1 и загрузкой четырех байтов незначительно.
, При попытке оптимизировать для строк кэша в очень высокоэффективном приложении, тогда Вы могли бы волноваться о том, насколько большой Ваше перечисление, но обычно я говорил бы, что это более ясно определить перечисление, чем использовать булевскую переменную.
В C++ ISO нет никакого обязательства для перечисления, чтобы быть больше, чем его самый большой перечислитель требует. В частности, перечисление {ПРАВДА, ЛОЖЬ} может иметь sizeof (1) даже когда sizeof (bool) == sizeof (интервал). Нет просто никакого требования. Некоторые компиляторы делают перечисления тем же размером как интервал. Это - функция компилятора, которая позволяется, потому что стандарт только налагает минимум. Другие компиляторы используют расширения для управления размером перечисления.
В C++ перечисление обычно является тем же размером как int
. Это сказало, что компиляторам весьма свойственно обеспечить переключатель командной строки, чтобы позволить размеру перечисления быть установленным на самый маленький размер, который соответствует диапазону определенных значений.
Если Ваше перечисление будет когда-либо иметь только два случая, действительно использование булевской переменной вместо этого могло бы быть лучшей идеей (емкость памяти, производительность, использование/логика), еще больше в Java.
, Если Вы задаетесь вопросом о стоимости памяти, она могла бы подразумевать, что Вы планируете использовать партию их. В Java можно использовать класс BitSet, или в меньшем масштабе, на обоих языках, можно управлять битами с битовыми операциями.
Нет, перечисление обычно является тем же размером как интервал, то же как булевская переменная.
sizeof (перечисление) зависит от того, что Вы имеете в перечислении. Я недавно пытался найти размер ArrayList () с параметрическими усилителями конструктора по умолчанию и никакими объектами сохраненным внутри (что означает, что возможность сохранить равняется 10). Оказалось, что ArrayList не является слишком большим < 100 байтов.
Так, sizeof (перечисление) для очень простого перечисления должны быть меньше чем 10 байтов. можно записать небольшую программу, дать ей определенное количество памяти и затем попытаться выделить перечисления. необходимо быть в состоянии понять его (это - то, как я узнал память ArrayList)
BR,
~A
В C/C++ перечисление будет тем же размером как интервал
С gcc, который можно добавить атрибут ((упакованный)) к перечислимому определению, чтобы заставить его взять минимальное место. Если самое большое значение в перечислении является < 256 это будет один байт, два байта, если самое большое значение будет < 65536, и т.д.
typedef enum {
MY_ENUM0,
MY_ENUM1,
MY_ENUM2,
MY_ENUM3,
MY_ENUM4,
MY_ENUM5
} __attribute__((packed)) myEnum_e;