В С++ 11 мы снабжаемся целыми типами фиксированной ширины, такими как std::int32_t
и std::int64_t
, которые являются необязательными и поэтому не являются оптимальными для написания кросс-платформенного кода. Тем не менее, мы также получили необязательные варианты для типов: например. "быстрые" варианты, например. std::int_fast32_t
и std::int_fast64_t
, а также варианты "наименьшего размера", например. std::int_least32_t
, которые имеют как минимум заданное количество бит в размере.
Код, над которым я работаю, является частью кросс-платформенной библиотеки на С++ 11, которая поддерживает компиляцию на самых популярных компиляторах Unix/Windows/Mac. Возникает вопрос, есть ли преимущество в замене существующих целых типов в коде целыми типами фиксированной ширины С++ 11.
Недостатком использования таких переменных, как std::int16_t
и std::int32_t
, является отсутствие гарантии того, что они доступны, поскольку они предоставляются только в том случае, если реализация напрямую поддерживает тип (согласно http://en.cppreference.com/w/cpp/types/integer).
Однако, поскольку int
не менее 16 бит, а 16 бит - достаточно большие для целых чисел, используемых в коде, как насчет использования std::int_fast16_t
по int? Предоставляет ли это возможность заменить все типы int
на std::int_fast16_t
и все unsigned int
на std::uint_fast16_t
таким образом или это не нужно?
Алогично, зная, что все поддерживаемые платформы и компиляторы имеют int
размером не менее 32 бит, имеет смысл заменить их на std::int_fast32_t
и std::uint_fast32_t
соответственно?