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_t
lugar del long long
tipo, que es de 8 bytes).
Sin embargo, hay uint_fast32_t
que tiene el mismo typedef
que uint32_t
. ¿El uso de la versión "rápida" hará que el programa sea más rápido?
Respuestas:
int
puede ser tan pequeño como 16 bits en algunas plataformas. Puede que no sea suficiente para su aplicación.uint32_t
no se garantiza que exista. Es un opcionaltypedef
que 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_t
establece 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_t
puede 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_t
sea 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_t
también, que es lo mismo,uint_fast32_t
excepto 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_t
es un tipo que tiene exactamente32
bits, 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_t
que puede estar disponible o no .Por otro lado,
uint_fast32_t
es un tipo que tiene al menos 32 bits, lo que también significa que si una implementación puede typedefuint32_t
comouint_fast32_t
si lo proporcionauint32_t
. Si no lo proporcionauint32_t
, entoncesuint_fast32_t
podría ser un typedef de cualquier tipo que tenga al menos32
bits.fuente
uint32_t
es 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_t
por 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_t
lo más probable es que se defina como sinónimouint32_t
de evitar eso.[u]int_(fast|least)N_t
no 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.h
implica 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.h
en 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
short
y 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