Почему uint_least16_t быстрее, чем uint_fast16_t для умножения в x86_64?

Стандарт С довольно неясен в отношенииuint_fast*_t семейство типов. В системе gcc-4.4.4 linux x86_64 типыuint_fast16_t а такжеuint_fast32_t оба 8 байтов в размере. Тем не менее, умножение 8-байтовых чисел кажется довольно медленным, чем умножение 4-байтовых чисел. Следующий фрагмент кода демонстрирует это:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int
main ()
{
  uint_least16_t p, x;
  int count;

  p = 1;
  for (count = 100000; count != 0; --count)
    for (x = 1; x != 50000; ++x)
      p*= x;

  printf("%"PRIuLEAST16, p);
  return 0;
}

Запустив команду времени на программу, я получаю

real 0m7.606s
user 0m7.557s
sys  0m0.019s

Если я изменю тип наuint_fast16_t (и модификатор printf), время становится

real 0m12.609s
user 0m12.593s
sys  0m0.009s

Так что, было бы не намного лучше, если бы заголовок stdint.h был определенuint_fast16_t (а также uint_fast32_t) быть 4-байтовым типом?

Ответы на вопрос(5)

Ваш ответ на вопрос