Что является хорошим примером использования различий между int * _t, int_fast * _t и int_least * _t в C ++ 11? - PullRequest
0 голосов
/ 02 октября 2018

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

Каковы объективные значения слова «самый быстрый» или «самый маленький»?Каков пример, в котором это было бы выгодно или даже необходимо?

1 Ответ

0 голосов
/ 02 октября 2018

Нет никакого объективного значения «самый быстрый»;это в основном суждение автора компилятора.Как правило, это означает расширение меньших значений до собственной ширины регистра архитектуры, но это не всегда самый быстрый (например, массив из 1 миллиарда записей, вероятно, будет обработан быстрее, если бы это были 8-битные значения, но uint_fast8_tможет быть 32-битным значением, потому что манипуляции с регистром ЦП выполняются быстрее для этого размера).

«самый маленький» обычно означает «тот же размер, что и запрошенные биты», но на странных архитектурах сограниченные значения размера на выбор (например, старые Crays имели все как 64-битный тип), int_least16_t будет работать (и без проблем станет 64-битным значением), в то время как компилятор, скорее всего, выдаст ошибку int16_t (потому что там невозможно получить истинное 16-битное целочисленное значение).

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

...