В чем разница между типами данных int16_t и int_fast16_t? [Дубликат]

Вы можете сделать что-то похожее на это:

// Get the parent to attatch the element into
var parent = document.getElementsByTagName("ul")[0];

// Create element with random id
var element = document.createElement("li");
element.id = "li-"+Math.floor(Math.random()*9999);

// Add event listener
element.addEventListener("click", EVENT_FN);

// Add to parent
parent.appendChild(element);
39
задан Coren 11 February 2012 в 13:32
поделиться

4 ответа

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

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

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

и

(7.18.1.3p2)" Имя typedef 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).

21
ответ дан ouah 19 August 2018 в 00:57
поделиться
  • 1
    Это не объясняет многое. & quot; на 32-битной машине, uint_fast16_t может быть определена как unsigned int & quot; - да, но вы можете использовать простой старый unsigned int напрямую, так как он является собственной целочисленной шириной, а стандарт гарантирует ширину не менее 16 бит. Аналогично, long встречает те же ограничения, что и int_fast32_t. – Fred Foo 11 February 2012 в 13:15
  • 2
    Я прочитал обоснование, но это не говорит , когда это быстрее, для какого конкретного использования? Если это действительно быстрее каждый раз, почему мы не используем их по умолчанию? – Coren 11 February 2012 в 13:23
  • 3
    @larsmans uint_fast16_t может быть псевдонимом для unsigned int в 32-битной машине и для unsigned long в 64-разрядной машине. Использование unsigned int вместо uint_fast16_t в вашей программе не будет одинаковым, если вы собираетесь скомпилировать свою программу на разных машинах. – ouah 11 February 2012 в 13:24
  • 4
    @ouah, это мой главный вопрос: когда я должен его использовать? у вас есть пример использования для основной архитектуры? – Coren 11 February 2012 в 13:34
  • 5
    @Coren Я уже приводил пример, проблема, о которой вы упомянули, - это определение fast . Реализация может выбрать привилегию быстрых арифметических операций над быстрым доступом к массиву или наоборот. Вот почему я лично не использую эти типы, я предпочитаю выбирать точный - с целочисленным типом, который соответствует моим потребностям. – ouah 11 February 2012 в 13:43

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

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

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

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

2
ответ дан Bo Persson 19 August 2018 в 00:57
поделиться

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

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

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

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

1
ответ дан cincodenada 19 August 2018 в 00:57
поделиться

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

2
ответ дан user833771 19 August 2018 в 00:57
поделиться
  • 1
    Да, но не должно int быть 64-бит на такой машине? – potrzebie 13 October 2014 в 11:03
  • 2
    Нет, int может быть как 16 бит, а его размер обычно зависит от компилятора, но не от платформы. Это, вероятно, артефакт 16 - 32-битного перехода. – user833771 3 November 2014 в 09:50
  • 3
    Ваша ссылка для & quot; быстрее & quot; сравнивает 32-битные и 64-битные режимы CPU для выполнения некоторой сложной задачи, не сравнивая производительность 32-битных и 64-разрядных целых чисел в одном и том же режиме процессора. – plugwash 3 February 2016 в 20:54
Другие вопросы по тегам:

Похожие вопросы: