В общем, используйте тип, который имеет смысл.Это может быть полезно с точки зрения проверки данных, целостности и постоянства.
Как правило, например, bool
будет фактически потреблять 4 байта в 32-битной архитектуре, возможно, 8 байтов в 64-битнойархитектура из-за проблем заполнения и выравнивания.Большинство компиляторов по умолчанию оптимизируют скорость, а не размер кода или использование памяти.Выравниваемый доступ обычно быстрее, чем невыровненный.В .Net, некоторым из этого можно управлять с помощью атрибутов.Насколько мне известно, JIT-компилятор не прилагает усилий для сжатия нескольких логических типов в целочисленное битовое поле.
То же самое можно сказать и о byte
типах.JIT-компилятор может сжать несколько байтовых типов (и даже изменить порядок хранения), чтобы разделить одно и то же слово (при условии, что вы не переопределяете такое поведение с такими атрибутами, как StructLayout
и FieldOffset
).
Например,:
struct Foo
{
string A;
short B;
string C;
short D;
}
Рассматривая ссылочные типы как указатели, вышеприведенные значения, вероятно, будут иметь размер 16 (может быть 14, но выровнен по 16).
Foo
можно переставить так, чтобыпорядок будет на самом деле:
struct Foo
{
string A;
string C;
short B;
short D;
}
Выше, вероятно, будет иметь размер 12 и выравнивание 12 или 16 (вероятно, 16).
... потенциально, в этой надуманнойНапример, вы можете сэкономить 4 байта из-за перестановки.И обратите внимание, что .Net более агрессивно относится к перестановке членов, чем типичный компилятор C ++.
(Кроме того, недавно я потратил некоторые усилия на поддержку библиотеки C ++. Я смог достичь 55%сокращение использования памяти исключительно за счет оптимизации расположения элементов).