Ответ 1
int
может быть 16, 32 или даже 64 бит на текущих компьютерах и компиляторах. В будущем он может быть больше (скажем, 128 бит).
Если ваш код в порядке с этим, пойдите с ним.
Если ваш код только протестирован и работает с 32-битными int, рассмотрите возможность использования int32_t
. Затем код будет сбой во время компиляции, а не во время выполнения при запуске в системе, у которой нет 32-битных int (что очень редко встречается сегодня).
int_fast32_t
- это когда вам нужно как минимум 32 бита, но вы очень заботитесь о производительности. На аппаратном обеспечении, в котором 32-битное целое загружается как целое число 64 бит, после этого битбайт возвращается к 32-битовому целому в громоздком процессе, int_fast_32_t
может быть 64-битным целым числом. Стоимость этого заключается в том, что на неясных платформах ваш код ведет себя по-разному.
Если вы не тестируете на таких платформах, я бы посоветовал это сделать.
Наличие перерывов во время сборки обычно лучше, чем перерывы во время выполнения. Если и когда ваш код фактически запущен на некотором неясном процессоре, который нуждается в этих функциях, тогда исправьте его. Правило "вы, вероятно, не понадобится", применяется.
Будьте консервативны, создавайте ранние ошибки на оборудовании, на котором вы не тестировались, и когда вам нужно подключиться к указанному оборудованию, работа и тестирование должны быть надежными.
Короче:
Используйте int_fast##_t
тогда и только тогда, когда вы протестировали свой код (и будете продолжать его тестировать) на платформах, где размер int меняется, и вы показали, что повышение производительности стоит того, что будет в будущем.
Использование int##_t
с общими размерами ##
означает, что ваш код не сможет скомпилироваться на платформах, на которых вы его не тестировали. Это хорошо; непроверенный код не является надежным, а ненадежный код обычно хуже, чем бесполезно.
Без использования int32_t
и используя int
, ваш код будет иногда иметь int
, которые равны 32, а иногда ints, которые равны 64 (и в теории больше), а иногда int
, которые равны 16. Если вы готовы тестировать и поддерживать каждый такой случай в каждом таком int
, идти за ним.
Обратите внимание, что массивы int_fast##_t
могут иметь проблемы с кешем: они могут быть необоснованно большими. Например, int_fast16_t
может быть 64 бит. Массив из нескольких тысяч или миллионов из них может быть индивидуально быстро работать, но промахи кэша, вызванные их массой, могут сделать их более медленными в целом; и риск того, что вещи поменяются на более медленное хранение, растет.
int_least##_t
может быть быстрее в этих случаях.
То же самое относится, к тому же, к сетевым и файловым данным, помимо очевидной проблемы, что данные сети/файла обычно должны соответствовать форматам, которые являются стабильными по сравнению с изменениями компилятора/оборудования. Это, однако, другой вопрос.
Однако при использовании целочисленных типов фиксированной ширины вы должны обратить особое внимание на то, что int, long и т.д. все еще имеют ту же ширину, что и раньше. Целочисленное продвижение по-прежнему происходит на основе размера int, который зависит от используемого вами компилятора. Интегральное число в вашем коде будет иметь тип int с соответствующей шириной. Это может привести к нежелательному поведению, если вы скомпилируете свой код с помощью другого компилятора. Для получения более подробной информации: fooobar.com/questions/22309/...