Может быть производительность? Я чувствую, что использование нефиксированных целых чисел только делает программы более сложными и склонными к сбою при портировании на другую архитектуру.
std::intN_t
предоставлены только если реализация может напрямую поддерживать их. Так что портирование кода, использующего их, может завершиться неудачей.
я бы предпочел std::intfastN_t
для общего пользования, потому что они имеют меньше ограничений и должны быть такими же быстрыми или быстрыми int
,
Кроме того, большинство кода C ++ использует int
везде, чтобы вы могли столкнуться со странностью продвижения при прохождении std::int32_t
в функцию, принимающую int
особенно если sizeof(int)
только 16 бит.
Многие API принимают или возвращают значения нефиксированных типов. Например, файловые дескрипторы имеют тип int
смещения или размеры файлов имеют тип off_t
а также strtol()
возвращает long
, Слепое преобразование таких значений из типов с фиксированным размером может привести к переполнению на некоторых машинах.
Типы гарантированной ширины (intN_t
) являются просто определениями типов для соответствующих «стандартных» целочисленных типов. Если платформа не имеет подходящего типа (например, она использует 36-битные целые числа), то она не может и не должна предоставлять typedef с гарантированной шириной.
Это означает, что производительность вряд ли может быть аргументом.
Общее правило для максимальной переносимости (в этом отношении) состоит в том, чтобы использовать «стандартные» целочисленные типы по умолчанию и типы гарантированной ширины, только если ваш алгоритм требует точного количества битов.
Предполагается, что «стандартные» целочисленные типы должны быть настолько широкими, насколько это гарантировано соответствующими стандартами (если вы посмотрите только на стандарт C ++, это будет: 8-бит char
16 бит int
32 бит long
и, если ваш компилятор поддерживает это, 64-битные long long
).
Если у вас есть данные, размер вашего типа которых важен для их функциональности, вам следует использовать типы с определенными размерами. Однако, например, фрагмент кода, который находится в пределах [того, что вы можете разумно ожидать) int диапазона (скажем, например, 1 … 1000 счетчик цикла), нет причины использовать int_32t только потому, что вы хотите определить, что ваша переменная , Он будет отлично работать с 16, 32, 64, 36, 18 или 49-битным целым числом, все равно. Так что пусть компилятор выберет лучший размер.
Существует вероятность, что компилятор генерирует худший код для целых чисел фиксированного размера, которые не являются «лучшим выбором» для архитектуры.
Очевидно, что любые данные, представленные по сети или в файле, должны иметь фиксированный размер. Аналогично, если у вас есть интерфейсы, которые требуют двоичной совместимости через границу интерфейса, то использование определенных типов размера очень полезно, чтобы избежать возникновения проблемы размера.