Почему булевская переменная использует больше памяти, чем символ?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

27
задан Vince Panuccio 4 January 2012 в 01:29
поделиться

9 ответов

Это - вопрос выравнивания памяти. 4-байтовые переменные работают быстрее, чем 2-байтовые. Это - причина, почему необходимо использовать интервал вместо байта или короткий для счетчиков и т.п..

необходимо использовать 2-байтовые переменные только, когда память является большим беспокойством, чем скорость. И это - причина, почему символ (который является Unicode в.NET) берет два байта вместо четыре.

50
ответ дан Gorpik 28 November 2019 в 04:17
поделиться

приблизительно boolean

Большинство других ответов понимает его превратно - выравнивание и скорость состоят в том, почему программист должен придерживаться интервала для счетчиков цикла, не, почему компилятор может заставить байт быть 4 байта шириной. Все Ваши обоснования, на самом деле, относятся к байту и короткий, а также булев.

В C#, по крайней мере, bool (или Система. Булевская переменная), встроенная структура 1 байт шириной, которая может быть автоматически упакована, таким образом, у Вас есть объект (которому нужны два слова памяти, которые будут представлены, по крайней мере, т.е. 8/16 байта на средах на 32/64 бита соответственно), с полем (по крайней мере один байт) плюс одно слово памяти для указания на него, т.е. всего по крайней мере 13/25 байта.

Это - действительно 1-я запись Google на "типах примитивов C#". http://msdn.microsoft.com/en-us/library/ms228360 (По сравнению с 80) .aspx

Также заключенная в кавычки ссылка ( http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx ) также указывает, что булевская переменная, по стандарту CLI, берет 1 байт.

На самом деле, однако, единственное место, где это видимо, находится на массивах булевских переменных - n, булевские переменные взяли бы n байты. В других случаях одна булевская переменная может взять 4 байта.

  • Внутренняя часть структура, большая часть времени выполнения (также в Java) выровняла бы все поля к 4-байтовой границе для производительности. JVM Monty для встроенных устройств более мудра - я предполагаю, что она переупорядочивает поля оптимально.
    • На локальной стопке кадра/операнда для интерпретатора, в большей части реализации, для производительности, одна запись стека является одним широким словом памяти (и возможно на.NET это должно быть 64-разрядное широкий для поддержки дважды и долго, который на.NET использует всего 1 запись стека вместо 2 в Java). JIT-компилятор может вместо этого использовать 1 байт для булевых местных жителей при сохранении другого Вара выровненным путем переупорядочения полей без влияния производительности, если дополнительные издержки стоят того.

приблизительно char

char составляют два байта, потому что, когда поддержка интернационализации требуется, использование двухбайтовых символов внутренне является самой безопасной ставкой. Это не связано непосредственно с желанием поддерживать Unicode, но с выбором придерживаться UTF-16 и к Основной Многоязычной Плоскости. В Java и C#, можно предположить все время, что один логический символ вписывается в переменную символа типа.

17
ответ дан Blaisorblade 28 November 2019 в 04:17
поделиться

Поэтому в 32-разрядной среде, ЦП может обработать 32-разрядные значения, более быстрые, чем 8-разрядные или 16-разрядные значения, таким образом, это - компромисс скорости/размера. Если необходимо сохранить память, и Вы имеете большое количество bools, просто используете uint с и сохраняете Ваши булевские переменные как биты 4 байтов uint с. Символы 2 байта шириной, так как они хранят 16-разрядные символы Unicode.

8
ответ дан Tamas Czinege 28 November 2019 в 04:17
поделиться

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

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

3
ответ дан dj_segfault 28 November 2019 в 04:17
поделиться

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

2
ответ дан Jared 28 November 2019 в 04:17
поделиться

Я нашел это: "На самом деле булевская переменная составляет 4 байта, не 2. Причина состоит в том, что это - то, что CLR поддерживает для булевской переменной. Я думаю, что это - то, что это делает, потому что 32 битовых значения намного более эффективны управлять, таким образом, компромисс времени/пространства, в целом, стоит того. Необходимо использовать класс битовый вектора (забудьте, где это), если необходимо создать затор набор битов вместе..."

Это записано Paul Wick в http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx

1
ответ дан Ville Salonen 28 November 2019 в 04:17
поделиться

В первую очередь, необходимо ли использовать профилировщика для определения, где у Вас есть проблема памяти, по моему скромному мнению.

1
ответ дан Aen Sidhe 28 November 2019 в 04:17
поделиться

Память является только беспокойством, если у Вас есть большой массив битов, в этом случае можно использовать Систему. Наборы. Класс BitArray.

1
ответ дан Joe 28 November 2019 в 04:17
поделиться

Потому что Windows и.Net использовали Unicode (UTF 16) начиная с начала как их внутренний набор символов. UTF 16 использует 2 байта за символ или пара 2-байтовых слов на символ, но только если необходимый, как это переменная ширина, кодирующая .

"Для символов в Основной многоязычной плоскости (BMP) получающееся кодирование является единственным 16-разрядным словом. Для символов в других плоскостях кодирование приведет к паре 16-разрядных слов"

, Мое предположение относительно булевских переменных было бы, они - четыре байта, поскольку регистр по умолчанию составляет 32 бита, и это было бы минимальным размером.Net, мог сделать логическую операцию на эффективно, если использование битовых операций.

0
ответ дан 28 November 2019 в 04:17
поделиться
Другие вопросы по тегам:

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