Должен ли я использовать наименьший возможный тип? - PullRequest
3 голосов
/ 24 февраля 2011

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

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

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

Или все это на самом деле просто преждевременная оптимизация, а потенциальный прирост производительности незначителен?

Ответы [ 3 ]

4 голосов
/ 24 февраля 2011

Преждевременная оптимизация действительно! Однако, как только вы оптимизируете, это также зависит от вашей архитектуры. Например, в ARM доступ к памяти должен быть выровнен по 32-битной системе (некоторые инструкции могут это сделать, но они просто выполняют 32-битный доступ, а затем маскируют / смещают за кулисы). Если вы используете байт, компилятор часто дает каждому «байту» четыре фактических байта оперативной памяти, чтобы к ним можно было обращаться быстрее (не говоря уже о том, что процессор будет работать слишком часто, если вы попытаетесь получить доступ к невыровненным байтам без специального кода для их обработки).

Существует аргумент в пользу использования 'int' для всего, так как это предпочтительный размер ЦП, но в основном, просто используйте нужный вам тип размера и позвольте компилятору беспокоиться об оптимизации: D

3 голосов
/ 24 февраля 2011

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

1 голос
/ 25 февраля 2011

В 32-битном процессоре упаковка четырех 8-битных байтов в 32-битное слово может улучшить время доступа к памяти, поскольку четыре байта могут быть извлечены одновременно. Однако теперь, чтобы манипулировать одним байтом, ЦПУ должен выполнять дополнительные сдвиги и маски и т. Д. Таким образом, любой способ упаковки 4 байтов в слово или оставления каждого байта без упаковки (используя 32-битный для каждого 8-битного байта) имеет свои плюсы и минусы.

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

Однако есть и другие ЛУЧШИЕ причины использовать тип, который соответствует области ваших данных: ясность, удобство обслуживания и т. Д. Я думаю, что это действительно козырная оптимизация, затрагивающая 99% времени.

...