Когда использовать тип данных, отличный от int? - PullRequest
4 голосов
/ 10 мая 2011

У меня есть проект, в котором у меня есть много объектов со многими свойствами, значения которых всегда будут меньше маленьких чисел, таких как 60, 100 и 255.

Я знаю, что при выполнении математики на byte s необходимо привести результат.Но кроме этого, есть ли какой-либо недостаток в использовании byte или short для всех этих свойств?Или, если взглянуть на это иначе, есть ли преимущество в использовании byte с или short с вместо int?

Ответы [ 3 ]

7 голосов
/ 10 мая 2011

byte s и short s полезны в сценариях взаимодействия, где вам нужен тип данных того же размера, который ожидает собственный код.

Они также могут экономить память при работе с очень большими наборами данных.

1 голос
/ 10 мая 2011

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

Как правило, например, 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%сокращение использования памяти исключительно за счет оптимизации расположения элементов).

1 голос
/ 10 мая 2011

Если вы храните их на диске, они занимают меньше места.Но часто это больше боли, чем стоит.

...