Entonces, el motivo de typedef: ed tipos de datos primitivos es abstraer la representación de bajo nivel y hacer que sea más fácil de comprender (en uint64_tlugar del long longtipo, que es de 8 bytes).
Sin embargo, hay uint_fast32_tque tiene el mismo typedefque uint32_t. ¿El uso de la versión "rápida" hará que el programa sea más rápido?

Respuestas:
intpuede ser tan pequeño como 16 bits en algunas plataformas. Puede que no sea suficiente para su aplicación.uint32_tno se garantiza que exista. Es un opcionaltypedefque la implementación debe proporcionar si tiene un tipo entero sin signo de exactamente 32 bits. Algunos tienen bytes de 9 bits, por ejemplo, por lo que no tienen unuint32_t.uint_fast32_testablece su intención claramente: es un tipo de al menos 32 bits que es el mejor desde el punto de vista del rendimiento.uint_fast32_tpuede tener de hecho 64 bits de longitud. Depende de la implementación.Lo que está viendo no es el estándar. Es una implementación particular (BlackBerry). Entonces no se puede deducir de ahí que
uint_fast32_tsea siempre lo mismo queuint32_t.Ver también:
Arquitecturas exóticas que preocupan a los comités de normas .
Mi visión pragmática basada en opiniones de los tipos de enteros en C y C ++ .
fuente
uint_least32_ttambién, que es lo mismo,uint_fast32_texcepto que favorece una tienda más pequeña en lugar de la velocidad.La diferencia radica en su exactitud y disponibilidad.
El doc aquí dice:
Y
Entonces, la diferencia es bastante clara:
uint32_tes un tipo que tiene exactamente32bits, y una implementación debe proporcionarlo solo si tiene un tipo con exactamente 32 bits, y luego puede typedef ese tipo comouint32_t. Esto significauint32_tque puede estar disponible o no .Por otro lado,
uint_fast32_tes un tipo que tiene al menos 32 bits, lo que también significa que si una implementación puede typedefuint32_tcomouint_fast32_tsi lo proporcionauint32_t. Si no lo proporcionauint32_t, entoncesuint_fast32_tpodría ser un typedef de cualquier tipo que tenga al menos32bits.fuente
uint32_tes exactamente de 32 bits en todos los sistemas (si existe), lo que podría no ser más rápido en comparación con el que tiene, digamos, 64 bits.uint_fast32_tpor otro lado, al menos de 32 bits, podría ser incluso de 64 bits.uint16_t x;se almacena en un registro de 32 bits en el ARM7-TDMI, es posible que el códigox++;deba evaluarse comox=((x+1)<<16)>>16);. En los compiladores para esa plataforma,uint_fast16_tlo más probable es que se defina como sinónimouint32_tde evitar eso.[u]int_(fast|least)N_tno son también opcionales? Seguramente no todas las arquitecturas son requeridas por el Estándar para soportar tipos primitivos de al menos 64 bits. Sin embargo, la redacción destdint.himplica que deben hacerlo. Me parece extraño que hayamos estado imponiendo eso desde 1999, algunos años antes de que la informática de 64 bits se convirtiera en la corriente principal, por no hablar del retraso (en muchos casos todavía actual) de las arquitecturas integradas. Esto me parece un gran descuido.Cuando estás
#include inttypes.hen tu programa, tienes acceso a un montón de formas diferentes de representar números enteros.El tipo uint_fast * _t simplemente define el tipo más rápido para representar un número determinado de bits.
Piénsalo de esta manera: defines una variable de tipo
shorty la usas varias veces en el programa, lo cual es totalmente válido. Sin embargo, el sistema en el que está trabajando podría funcionar más rápidamente con valores de tipoint. Al definir una variable como tipouint_fast*t, la computadora simplemente elige la representación más eficiente con la que puede trabajar.Si no hay diferencia entre estas representaciones, entonces el sistema elige la que desea y la usa de manera consistente en todo momento.
fuente
Tenga en cuenta que la versión rápida podría tener más de 32 bits. Si bien el int rápido encajará bien en un registro y estará alineado y similares: pero, usará más memoria. Si tiene matrices grandes de estos, su programa será más lento debido a más aciertos de memoria caché y ancho de banda.
No creo que el CPUS moderno se beneficie de fast_int32, ya que generalmente el signo que se extiende de 32 a 64 bits puede ocurrir durante la instrucción de carga y la idea de que existe un formato de entero 'nativo' que es más rápido es anticuada.
fuente