В чем разница между intXX_t и int_fastXX_t? - PullRequest
47 голосов
/ 11 февраля 2012

Я недавно обнаружил существование стандартного самого быстрого типа, в основном int_fast32_t и int_fast64_t .

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

ВСтандарт C99, говорится в §7.18.1.3p2:

"Имя typedef int_fastN_t обозначает самый быстрый целочисленный тип со знаком с шириной не менее N. Имя typedef uint_fastN_t обозначает самый быстрый целое число без знакас шириной не менее N ".

И в §7.18.1.3p1 есть также цитата:

" Назначенному типу не гарантируетсяБыстрее всего для всех целей: если реализация не имеет четких оснований для выбора одного типа над другим, она просто выберет некоторый целочисленный тип, удовлетворяющий требованиям подписи и ширины.irements. "

Мне неясно, что на самом деле означает fast .Я не понимаю, когда мне следует использовать этот тип, а когда нет.

Я немного погуглил по этому вопросу и обнаружил, что некоторые open source проекты изменили некоторые из своих функций, но не всеиз них.Они на самом деле не объяснили, почему они изменили часть, и только часть своего кода.

Вы знаете, каковы конкретные случаи / применения, когда int_fastXX_t действительно быстрее классических?

Ответы [ 4 ]

24 голосов
/ 11 февраля 2012

В Стандарте C99 7.18.1.3 Самые быстрые целочисленные типы минимальной ширины.

(7.18.1.3p1) "Каждый из следующих типов определяет целочисленный тип, который обычно самый быстрый225) для работысреди всех целочисленных типов, которые имеют по крайней мере указанную ширину. "

225)" Назначенный тип не гарантированно будет самым быстрым для всех целей; если реализация не имеет четких оснований для выбора одного типа над другим,он просто выберет некоторый целочисленный тип, удовлетворяющий требованиям подписи и ширины. "

и

(7.18.1.3p2)" Имя типа определения int_fastN_t обозначает самое быстрое целое число со знакомтип с шириной не менее N. Имя typedef uint_fastN_t обозначает самый быстрый целочисленный тип без знака с шириной не менее N. "

Типы int_fastN_t и uint_fastN_t являются аналогамицелочисленные типы точной ширины intN_t и uintN_t.Реализация гарантирует, что они принимают не менее N битов, но реализация может занимать больше битов, если она может выполнять оптимизацию с использованием более крупных типов;это просто гарантирует, что они занимают по крайней мере N бит.

Например, на 32-разрядном компьютере uint_fast16_t можно определить как unsigned int, а не unsigned short, поскольку работа с типами машинного размера слова будет более эффективной.

Другая причина их существования заключается в том, что целочисленные типы точной ширины являются необязательными в C, но требуются самые быстрые целочисленные типы минимальной ширины и целочисленные типы минимальной ширины (int_leastN_t и uint_leastN_t).

3 голосов
/ 11 февраля 2012

Вероятно, не будет разницы, за исключением экзотического оборудования, где int32_t и int16_t даже не существует.

В этом случае вы можете использовать int_least16_t, чтобы получить наименьший тип, который может содержать 16 бит. Может быть важно, если вы хотите сэкономить место.

С другой стороны, использование int_fast16_t может дать вам другой тип, больший, чем int_least16_t, но, возможно, более быстрый для "типичного" целочисленного использования. Реализация должна учитывать, что быстрее, а что типично. Возможно, это очевидно для какого-то специального оборудования?

На большинстве распространенных машин все эти 16-битные типы будут typedef для short, и вам не нужно беспокоиться.

2 голосов
/ 13 января 2014

Gnu libc определяет {int, uint} _fast {16,32} _t как 64-битные при компиляции для 64-битных процессоров и 32-битных в противном случае. Операции с 64-разрядными целыми числами выполняются быстрее на 64-разрядных процессорах Intel и AMD x86, чем те же операции с 32-разрядными целыми числами.

1 голос
/ 03 февраля 2016

IMO, они довольно бессмысленны.

Компилятору не важно, что вы называете типом, только какой он размер и какие правила к нему применяются.так что если int, in32_t и int_fast32_t все 32-битные на вашей платформе, они почти наверняка будут работать одинаково.

Теория заключается в том, что разработчики языка должны выбирать, основываясь на том, что является самым быстрым на их оборудовании, ноСтандартные писатели никогда не давали четкого определения самых быстрых.Добавьте это к тому факту, что сопровождающие платформы не хотят менять определение таких типов (потому что это будет разрыв ABI), и определения в конечном итоге выбираются произвольно в начале срока службы платформ (или наследуются от других платформ, которые использовались библиотекой C).перенесено с) и никогда не затрагивалось.

Если вы на уровне микрооптимизации, который, по вашему мнению, может иметь существенное значение, с переменным размером, сравните различные варианты с вашим кодом на ваш процессор.В противном случае не беспокойтесь об этом.«Быстрые» типы не добавляют ничего полезного IMO.

...