2012-07-27 22 views
6

En C++, ¿hay algún beneficio al usar long over int?C++ int frente a largo

Parece que long es el tamaño de palabra predeterminado para las arquitecturas x86 y x86_64 (32 bits en x86 y 64 bits en x86_64, mientras que int es 32 bits en ambos), que (en teoría) debería ser más rápido al hacer aritmética.

El estándar C++ garantiza sizeof (int) < = sizeof (long), pero parece que long es el tamaño predeterminado tanto en sistemas de 32 bits como de 64 bits, por lo que debe utilizarse en lugar de int cuando sea posible cuando intenta escribir código que es portátil en ambas arquitecturas?

+1

En Windows, 'long' es de 32 bits. En Linux, 'long' es de 64 bits. Eso rompe muchas aplicaciones. – Mysticial

+0

Relacionado: [¿Cuál es la diferencia entre un int y un largo en C++?] (Http://stackoverflow.com/q/271076/11343) – CharlesB

Respuesta

1

Lo que es más rápido y lo que no lo es, es algo que cada vez es más difícil de predecir. La razón es que los procesadores ya no son "simples" y con todas las dinámicas complejas y algoritmos detrás de ellos, la velocidad final puede seguir reglas que son totalmente contra-intuitivas.

La única salida es simplemente medir y decidir. También tenga en cuenta que lo que es más rápido depende de los pequeños detalles e incluso para las CPU compatibles, lo que es una optimización para uno puede ser una pesimismo para el otro. En el caso de partes muy críticas, algunos programas de software solo prueban y verifican las temporizaciones para diferentes enfoques en tiempo de ejecución durante la inicialización del programa.

Dicho esto, como regla general, el número entero más rápido que puede tener es int. Deberías usar otros enteros solo si los necesitas específicamente (por ejemplo, si long es más grande y necesitas la mayor precisión, o si short es más pequeño pero suficiente y necesitas guardar la memoria).

Aún mejor si necesita un tamaño específico, utilice un tipo estándar fijo o agregue un typedef en lugar de solo rociar alrededor de long donde lo necesite. De esta forma, será más fácil admitir diferentes compiladores y arquitecturas, y también la intención será más clara para quien vaya a leer el código en el futuro.

5

long se garantiza que es de al menos 32 bits, mientras que int solo garantiza que tenga al menos 16 bits. Al escribir un programa totalmente portátil, puede usar long, donde el tamaño garantizado de int no es suficiente para sus necesidades.

En la práctica, sin embargo, muchas personas suponen implícitamente que int es más grande que las garantías estándar, ya que solo se dirigen a dichas plataformas. En estas situaciones, generalmente no importa mucho.

int debe ser el tamaño "natural" de un número para un sistema; en teoría, long puede ser más costoso, pero en muchas arquitecturas las operaciones en long no son más caras, incluso cuando long es en realidad más largo que .

4

Si necesita tipos enteros que seguirán siendo del mismo tamaño en diferentes plataformas, desea los tipos en <stdint.h>.

Por ejemplo, si necesita absolutamente un entero sin signo de 32 bits, quiere uint32_t. Si necesita absolutamente un entero con signo de 64 bits, quiere int64_t.

+0

De acuerdo. Pero utilice los tipos 'xintX_t' con la mayor moderación posible.Estos pueden afectar el rendimiento severamente si el código se transporta a una arquitectura de CPU menos permisiva. – wallyk

+0

@wallyk: Por supuesto, el código es defectuoso debido a las suposiciones sobre el tamaño de los tipos que ya no son verdad duele aún más, así que preferiría arriesgar las penalizaciones de rendimiento del código defectuoso (por supuesto, el código no debería hacer más suposiciones sobre el tamaño del tipo entonces lo que está garantizado por el estándar, pero todavía sucede con la suficiente frecuencia) – Grizzly

Cuestiones relacionadas