Разница между int32 t и int fast32 t [дубликат]
этот вопрос уже есть ответ здесь:
в чем разница между ними? Я знаю, что int32_t-это ровно 32 бита независимо от среды, но, поскольку его имя предполагает, что это быстро, насколько быстрее может быть int_fast32_t по сравнению с int32_t? А если значительно быстрее, то почему?
2 ответов
C указывается в терминах идеализированной абстрактной машины. Но реальное оборудование имеет поведенческие характеристики, которые не фиксируются языковым стандартом. The _fast
типы-это псевдонимы типов, которые позволяют каждой платформе указывать типы, "удобные" для оборудования.
например, если бы у вас был массив 8-битных целых чисел и вы хотели бы мутировать каждый из них по отдельности, это было бы довольно неэффективно на современных настольных компьютерах, потому что их загрузка операции обычно хотят заполнить весь регистр процессора, который имеет ширину 32 или 64 бит ("машинное слово"). Таким образом, много загруженных данных заканчивается впустую, и, что более важно, вы не можете распараллелить загрузку и хранение двух соседних элементов массива, потому что они живут в одном машинном слове и, следовательно, должны быть последовательно загружены-изменены-сохранены.
на _fast
типы обычно так же широки, как машинное слово, если это возможно. То есть, они могут быть широкое чем вы нужно и, таким образом, потреблять больше памяти (и, следовательно, труднее кэшировать!), но ваше оборудование может получить к ним доступ быстрее. Все зависит от модели использования. (Например. массив int_fast8_t
вероятно, будет массив машинных слов, и плотный цикл, изменяющий такой массив, может значительно выиграть.)
единственный способ узнать, имеет ли это какое-либо значение, - сравнить!
int32_t
- Это целое число, которое составляет ровно 32 бит. Это полезно, если вы хотите, например, создать структуру с точным размещением памяти.
int_fast32_t
является" самым быстрым " целым числом для вашего текущего процессора, которое, наконец, больше или равно int32_t
. Я не знаю, действительно ли есть усиление для текущих процессоров (x86 или ARM)
но я могу, наконец, очертить реальный случай: я работал с процессором PowerPC 32bits. При доступе к misaligned 16bits int16_t
, это было неэффективно, поскольку он должен сначала перестроить их в одном из своих регистров 32bits. Для данных, не сопоставленных с памятью, поскольку у нас не было ограничений памяти, было более эффективно использовать int_fast16_t
(которые на самом деле были 32bits int).