Зачем использовать целые числа меньше 32 бит? - PullRequest
5 голосов
/ 26 октября 2009

Я всегда хотел бы использовать переменную с наименьшим размером, которая будет работать отлично, но действительно ли это меня выручит, если я использую короткие байтовые целые числа вместо целых, а память адресуется 32-битным словом, компилятор что-то делает для улучшить использование памяти?

Ответы [ 5 ]

11 голосов
/ 26 октября 2009

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

4 голосов
/ 26 октября 2009

Нет, int был выбран как самый быстрый тип int для 32-64-разрядных архитектур mopdern, использование более коротких (short, sbyte) типов будет только снижать производительность.

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

Расчет с 8 битами:

sbyte a, b, c;
a = (sbyte) (b + c);

Тип-трансляция является обязательной и включает стоимость времени выполнения.

3 голосов
/ 26 октября 2009

Обычно придерживайтесь int и т. Д.

В дополнение к другим ответам; также есть случаи, когда вы намеренно хотите поддерживать только данный размер данных, потому что он представляет некоторую ключевую правду о данных. Это может быть ключевым при обращении к внешним системам (в частности, к взаимодействию, но также к базам данных, форматам файлов и т. Д.), И может быть смешано с арифметикой checked - чтобы обнаружить переполнения как можно раньше.

3 голосов
/ 26 октября 2009

Если это простая переменная, ничто не будет получено при использовании более короткой ширины, и некоторая производительность может быть потеряна. Компилятор автоматически расширит хранилище до полного слова процессора, поэтому даже если вы объявляете только 16 бит, он, вероятно, займет 32 бита в стеке. Кроме того, компилятору может потребоваться выполнить определенные операции усечения в некоторых случаях (например, когда поле является частью структуры); это может вызвать небольшие накладные расходы.

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

2 голосов
/ 26 октября 2009

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

Принцип таков: выделите только ту ширину, которая требуется вашим данным, и позвольте компилятору найти любые ошибки переполнения, которые могут возникнуть, это дополнительная техника отладки, которая очень эффективна. Если вы знаете , что значение никогда не должно превышать пороговое значение, выделите его только до этого порогового значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...