О boolean
Большинство других ответов ошибаются - выравнивание и скорость - это то, почему программист должен придерживаться int для счетчиков циклов, а не то, почему компилятор может сделать байт шириной 4 байта. Фактически все ваши рассуждения применимы как к байтовым, так и к коротким, а также к логическим значениям.
По крайней мере, в C # bool (или System.Boolean) - это встроенная структура шириной в 1 байт, которая может быть автоматически упакована, поэтому у вас есть объект (для которого нужно представить как минимум два слова памяти, как минимум, т. е. 8/16 байтов в средах 32/64 бит соответственно) с полем (не менее одного байта) плюс одно слово памяти для указания на него, т. е. всего не менее 13/25 байтов.
Это действительно первая запись Google о "C # примитивных типах".
http://msdn.microsoft.com/en-us/library/ms228360(VS.80).aspx
Также в цитируемой ссылке (http://geekswithblogs.net/cwilliams/archive/2005/09/18/54271.aspx) также указано, что булево значение по стандарту CLI занимает 1 байт.
На самом деле, однако, единственное место, где это видно, это массивы логических значений - n логических значений будет занимать n байтов. В остальных случаях одно логическое значение может занимать 4 байта.
- Внутри структуры большинство сред выполнения (также в Java) будет выравнивать все поля с 4-байтовой границей для производительности. Monty JVM для встраиваемых устройств более разумен - я думаю, он оптимально меняет порядок полей.
- В локальном стеке фреймов / операндов для интерпретатора, в большинстве реализаций, для производительности, одна запись стека имеет ширину в одно слово памяти (и, возможно, в .NET она должна быть шириной 64-битной, чтобы поддерживать double и long, что в .NET используется только 1 запись в стеке вместо 2 в Java). JIT-компилятор может вместо этого использовать 1 байт для логических локальных переменных, сохраняя выравнивание других переменных путем переупорядочения полей без влияния на производительность, если дополнительные издержки того стоят.
О char
char
- два байта, потому что, когда требуется поддержка интернационализации, использование двухбайтовых символов внутри является самой безопасной ставкой. Это не связано напрямую с выбором поддержки Unicode, но с выбором придерживаться UTF-16 и базовой многоязычной плоскости. В Java и C # вы можете все время предполагать, что один логический символ вписывается в переменную типа char.