C ++: недостатки использования std :: uint_fastn_t

Итак, я наткнулся на Когда следует использовать целочисленные типы C ++ с фиксированной шириной и как они влияют на производительность? и Следует ли использовать cstdint?, где перечислены преимущества и недостатки целочисленных типов фиксированной ширины, как определено в <cstdint>.

Мне нравится кодировать предполагаемый диапазон переменной в ее тип, но я также не хочу заставлять ЦП выполнять дополнительные операции только для использования uint16_t вместо простого int, когда мне не обязательно иметь переменную держит ровно 16 бит.

Я также читал о таких типах, как std::uint_fast16_t и так далее. Насколько я понимаю, использование этого типа должно гарантировать, что я гарантированно смогу сохранить 16-битное число в этой переменной, но мне никогда не придется платить штрафы во время выполнения за использование этого типа, поскольку на каждой архитектуре, где, например, uint32_t будет быстрее, это будет использоваться для меня автоматически.

Это оставляет меня с вопросом: кроме случая, когда мне действительно нужна переменная с точной разрядностью, есть ли какие-либо недостатки использования std::uint_fast16_t вместо unsigned int?


РЕДАКТИРОВАТЬ: это, конечно, предполагает, что потребление памяти не является проблемой. Если бы это было так, я бы использовал вместо этого std::uint_least16_t.


person Raven    schedule 05.05.2021    source источник
comment
никогда не должны платить штрафы за использование этого типа, больше похоже на то, что обычно не нужно платить какие-либо штрафы за использование этого типа   -  person chux - Reinstate Monica    schedule 05.05.2021
comment
@ chux-ReinstateMonica Как это? Будет ли это ошибкой в ​​реализации C ++ на этой конкретной машине или чем-то еще?   -  person Raven    schedule 05.05.2021
comment
... есть какие-то недостатки ... в том, что вы можете использовать вдвое больше ожидаемого места, когда uint32_t быстрее.   -  person Richard Critten    schedule 05.05.2021
comment
@RichardCritten Ага, честно - позвольте мне пояснить, что в вопросе ...   -  person Raven    schedule 05.05.2021
comment
TL; DR из дубликата: uint_fast16_t может быть не ровно 16 бит. Это будет самый «быстрый» тип с минимум 16 битами.   -  person Adrian Mole    schedule 05.05.2021
comment
@AdrianMole Этот вопрос уже объясняет разницу между ними. Я не думаю, что дубликат точный. Этот вопрос спрашивает, есть ли другие недостатки использования типа fast, кроме дополнительного размера.   -  person François Andrieux    schedule 05.05.2021
comment
@AdrianMole Я также думаю, что связанный вопрос не отвечает на мой вопрос.   -  person Raven    schedule 05.05.2021
comment
Разница не должна быть недостатком. Одна машина красная, другая желтая. Это разница, но не обязательно недостаток   -  person Raven    schedule 05.05.2021
comment
Хорошо - я открылся снова после убедительной массы аргументов. :-)   -  person Adrian Mole    schedule 05.05.2021
comment
@AdrianMole Вопросы о плюсах и минусах одного типа по сравнению с другим в C / C ++ - сложный вопрос, поэтому я ценю ваши за / против мысли о дублировании. У нас может быть один вопрос о множестве типов по сравнению с множеством других типов. Так много вещей, которые нужно учитывать, и поэтому они слишком общие. Некоторые вопросы относятся к конкретным случаям, некоторые - нет. Коротко о том, что нужно знать каждому программисту о выборе типа. Возможно, нам нужен вопрос и ответ, который будет служить оглавлением, связанным с конкретными случаями?   -  person chux - Reinstate Monica    schedule 05.05.2021


Ответы (1)


есть ли недостатки использования std::uint_fast16_t вместо unsigned int.

Один недостаток: неопределенный тип из-за обычных рекламных акций. uint16_fast_t преобразуется в подписанный или неподписанный?

uint16_fast_t fa = 1;
unsigned un = 1;
int i;

fa some_operator i --> may result in an `int` or `uint16_fast_t`
un some_operator i --> result is unsigned.

Неоднозначность может отрицательно повлиять на более сложные уравнения и поведение при переполнении.


IMO, uint16_fast_t полезно только в узком управляемом коде, а не для общего улучшения производительности. Будьте осторожны с Действительно ли преждевременная оптимизация является корнем всего зла? ?.

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

person chux - Reinstate Monica    schedule 05.05.2021
comment
Просто чтобы уточнить: когда вы пишете, обычно лучше использовать для ясности и без подписи. вы имеете в виду unsigned int или uint16_t (придерживаться моего примера)? - person Raven; 05.05.2021
comment
@Raven тип: unsigned. - person chux - Reinstate Monica; 05.05.2021
comment
@Raven Я не углублялся в uint_fastn_t, а сосредоточился на uint_fast16_t. Недостаток uint_fastn_t против unsigned, когда n > 16 - это unsigned, возможно, из достаточного диапазона. - person chux - Reinstate Monica; 05.05.2021
comment
@Raven IMO, uint_fastn_t следует указать не меньше, чем unsigned, чтобы избежать недостатка, о котором говорилось выше. Я считаю uint_fastn_t слишком проблематичным для переносимого кода. - person chux - Reinstate Monica; 05.05.2021
comment
Спасибо за разъяснения :) - person Raven; 05.05.2021