No, prohibir los tipos de enteros incorporados sería absurdo. Sin embargo, tampoco deberían ser objeto de abuso.
Si necesita un entero de exactamente N de ancho, use std::intN_t
(o std::uintN_t
si necesita una versión unsigned
). Pensar en int
como un entero de 32 bits y long long
como un entero de 64 bits es simplemente incorrecto. Puede suceder que sea así en sus plataformas actuales, pero esto se basa en un comportamiento definido por la implementación.
El uso de tipos enteros de ancho fijo también es útil para interoperar con otras tecnologías. Por ejemplo, si algunas partes de su aplicación están escritas en Java y otras en C ++, probablemente querrá hacer coincidir los tipos de enteros para obtener resultados consistentes. (Tenga en cuenta que el desbordamiento en Java tiene una semántica bien definida, mientras que signed
desbordamiento en C ++ es un comportamiento indefinido, por lo que la consistencia es un objetivo alto). También serán invaluables al intercambiar datos entre diferentes hosts informáticos.
Si no necesita exactamente N bits, pero solo un tipo que sea lo suficientemente ancho , considere usar std::int_leastN_t
(optimizado para el espacio) o std::int_fastN_t
(optimizado para la velocidad). Nuevamente, ambas familias también tienen unsigned
homólogas.
Entonces, ¿cuándo usar los tipos incorporados? Bueno, dado que el estándar no especifica su ancho de manera precisa, utilícelos cuando no se preocupe por el ancho de bits real pero sobre otras características.
Un char
es el entero más pequeño al que puede acceder el hardware. El lenguaje realmente te obliga a usarlo para crear alias de memoria arbitraria. También es el único tipo viable para representar cadenas de caracteres (estrechas).
Un int
generalmente será el tipo más rápido que la máquina puede manejar. Será lo suficientemente ancho como para que se pueda cargar y almacenar con una sola instrucción (sin tener que enmascarar o desplazar los bits) y lo suficientemente estrecho para que pueda operarse con las instrucciones de hardware más eficientes. Por lo tanto, int
es una opción perfecta para pasar datos y realizar operaciones aritméticas cuando el desbordamiento no es una preocupación. Por ejemplo, el tipo de enumeración subyacente predeterminado es int
. No lo cambie a un entero de 32 bits solo porque puede hacerlo. Además, si tiene un valor que solo puede ser –1, 0 y 1, un int
es una opción perfecta, a menos que vaya a almacenar grandes matrices de ellos, en cuyo caso es posible que desee utilizar datos más compactos. escriba al costo de tener que pagar un precio más alto por acceder a elementos individuales. El almacenamiento en caché más eficiente probablemente pagará por esto. Muchas funciones del sistema operativo también se definen en términos de int
. Sería tonto convertir sus argumentos y resultados de un lado a otro. Todo lo que podría hacer es introducir errores de desbordamiento.
long
generalmente será el tipo más amplio que se puede manejar con instrucciones de una sola máquina. Esto hace que especialmente unsigned long
sea muy atractivo para tratar con datos en bruto y todo tipo de cosas de manipulación de bits. Por ejemplo, esperaría ver unsigned long
en la implementación de un bit-vector. Si el código se escribe con cuidado, no importa qué tan ancho sea el tipo (porque el código se adaptará automáticamente). En las plataformas en las que la palabra de máquina nativa es de 32 bits, lo más deseable es que la matriz de respaldo del vector de bits sea una matriz de unsigned
de enteros de 32 bits, ya que sería tonto utilizar un tipo de 64 bits que deba cargarse a través de instrucciones caras, solo para cambiar y enmascarar los bits innecesarios de nuevo de todos modos. Por otro lado, si el tamaño de palabra nativo de la plataforma es de 64 bits, quiero una matriz de ese tipo porque significa que las operaciones como "encontrar el primer conjunto" pueden ejecutarse hasta el doble de rápido. Por lo tanto, el "problema" del tipo de datos long
que está describiendo, que su tamaño varía de una plataforma a otra, en realidad es una característica que se puede utilizar. Solo se convierte en un problema si piensa en los tipos incorporados como tipos de un cierto ancho de bits, que simplemente no son.
char
, int
y long
son tipos muy útiles como se describe anteriormente. short
y long long
no son tan útiles porque su semántica es mucho menos clara.