Разница между int32_t и int_fast32_t
Какая разница между двумя? Я знаю, что int32_t ровно 32 бита независимо от среды, но, как следует из названия, он быстрый, насколько быстрее int_fast32_t действительно можно сравнить с int32_t? И если это значительно быстрее, то почему так?
2 ответа
C определяется в терминах идеализированной абстрактной машины. Но у реального оборудования есть поведенческие характеристики, которые не отражены в стандарте языка. _fast
типы - это псевдонимы типов, которые позволяют каждой платформе указывать типы, которые "удобны" для оборудования.
Например, если у вас есть массив из 8-битных целых чисел и вы хотите изменить каждое из них по отдельности, это будет довольно неэффективно на современных настольных компьютерах, потому что их операции загрузки обычно хотят заполнить весь регистр процессора, который равен 32 или 64 немного широкий ("машинное слово"). Таким образом, большая часть загруженных данных теряется, и, что более важно, вы не можете распараллелить загрузку и сохранение двух соседних элементов массива, потому что они находятся в одном машинном слове и, следовательно, должны быть последовательно загружены-изменены-сохранены.
_fast
Типы обычно такие же широкие, как машинное слово, если это возможно. То есть они могут быть шире, чем вам нужно, и, следовательно, потреблять больше памяти (и, следовательно, их сложнее кэшировать!), Но ваше оборудование может иметь к ним доступ быстрее. Однако все зависит от модели использования. (Например, массив int_fast8_t
вероятно, будет массивом машинных слов, и узкий цикл, модифицирующий такой массив, может значительно выиграть.)
Единственный способ узнать, имеет ли это какое-то значение, - это сравнить!
int32_t
является целым числом, которое точно 32 бит. Это полезно, если вы хотите, например, создать структуру с точным размещением в памяти.
int_fast32_t
это "самое быстрое" целое число для вашего текущего процессора, которое, наконец, больше или равно int32_t
, Я не знаю, есть ли выигрыш для современных процессоров (x86 или ARM)
Но я могу, наконец, обрисовать реальный случай: я работал с 32-битным процессором PowerPC. При доступе смещенные 16 бит int16_t
, это было неэффективно, поскольку он должен сначала перераспределить их в одном из своих 32-битных регистров. Для данных, не отображаемых в памяти, поскольку у нас не было ограничений памяти, было бы более эффективно использовать int_fast16_t
(которые были на самом деле 32bit Int).