2010-09-16 26 views
15

En mi aplicación de C#, me gustaría saber si es realmente importante usar la abreviatura para números más pequeños, int para más grande, etc. ¿El consumo de memoria realmente importa?¿Realmente importa distinguir entre corto, int, largo?

+0

Las personas estúpidas no entienden ... [StructLayout (LayoutKind.Sequential, Paquete = 1)] usted puede hacer que la clase base y definir el campo como sea necesario en derivados. – nim

Respuesta

19

A menos que empaque grandes cantidades de estos en algún tipo de estructura, probablemente no afecte el consumo de memoria. La mejor razón para usar un tipo de entero particular es la compatibilidad con una API. Aparte de eso, solo asegúrese de que el tipo que elija tenga suficiente alcance para cubrir los valores que necesita. Más allá de eso para variables locales simples, no importa mucho.

0

Todo depende de cómo los esté usando y cuántos tenga. Incluso si solo tiene unos pocos en la memoria a la vez, esto podría impulsar el tipo de datos en su backing store.

1

Esto es totalmente relativo a la cantidad de memoria que puede permitirse perder. Si no estás seguro, probablemente no importe.

3

Solo usted puede juzgar si el consumo de memoria realmente importa . En la mayoría de las situaciones, no hará ninguna diferencia discernible.

En general, recomendaría usar int/Int32 donde puede salirse con la suya. Si realmente necesita para usar short, long, byte, uint etc. en una situación particular, hágalo.

4

Para las aplicaciones de C# que no intentan copiar un tipo de estructura de un archivo, es mejor utilizar ints o cualquiera que sea su formato nativo. La única otra vez que podría importar es si se usan matrices en el orden de millones de entradas. Incluso entonces, aún consideraría los Ints.

7

La respuesta simple es que no es realmente importante.

La respuesta más compleja es que depende.

Obviamente, debe elegir un tipo que mantenga su estructura de datos sin desbordamiento, e incluso si solo está almacenando números más pequeños, entonces elegir int es probablemente lo más sensato.

Sin embargo, si su aplicación carga una gran cantidad de datos o se ejecuta en un dispositivo con memoria limitada, entonces es posible que tenga que elegir short para algunos valores.

0

El consumo de memoria basado en el tipo de enteros que está almacenando probablemente no sea un problema en una aplicación de escritorio o web. En un juego o aplicación de dispositivo móvil, puede ser más un problema.

Sin embargo, la verdadera razón para diferenciar entre los tipos es el tipo de números que necesita almacenar. Si tiene números realmente grandes, o de alta precisión, puede necesitar usar long para almacenarlo.

1

La respuesta es: depende. La cuestión de si la memoria importa es totalmente de usted. Si está escribiendo una pequeña aplicación que tiene requisitos mínimos de almacenamiento y memoria, entonces no. Si eres de Google, almacena miles de millones de registros en miles de servidores, entonces cada byte puede costar un poco de dinero real.

1

Hay algunos casos en los que realmente me molesto en elegir.

  1. Cuando tengo limitaciones de memoria
  2. Cuando hago operaciones BitShift
  3. Cuando me importa acerca de la portabilidad x86/x64

todos los demás casos es int todo el camino

Edición: Acerca de x86/x64

En la arquitectura x86, un int es de 32 bits, pero en x64, un int es de 64 bits

Si escribe "int" en todas partes y se mueve de una arquitectura a otra, podría ocasionar problemas. Por ejemplo, tiene una API de 32 bits que exporta una larga. Lo conviertes en un número entero y todo está bien. Pero cuando pasas a x64, el infierno se desata.

El int se define por su arquitectura de modo que cuando cambie la arquitectura que tienen que ser conscientes de que podría dar lugar a problemas potenciales

+0

No entiendo "Cuando me importa acerca de la portabilidad x86/x64". ¿Puede explicar esto? –

+0

no sé sobre C#, pero en C un 'int' es de 32 bits en amd64 y x86. Es el "largo" que cambia de tamaño. El –

+4

x 86 x 64 vs argumento es erróneo en C# - 'int' es un alias de' System.Int32' (ver [MSDN] (http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx)) Si quieres el tamaño nativo de la plataforma, entonces creo que debes usar IntPtr. – Samuel

0

El contexto de la situación es muy importante aquí. Sin embargo, no es necesario que adivine si es importante o no, estamos lidiando con cosas cuantificables aquí. Sabemos que estamos guardando 2 bytes usando un short en lugar de un int.

¿Qué se estima el mayor número de casos van a estar en la memoria en un punto dado en el tiempo? Si hay un millón, estás ahorrando ~ 2Mb de Ram. ¿Es eso una gran cantidad de ram? De nuevo, depende del contexto, si la aplicación se ejecuta en un escritorio con 4 Gb de memoria RAM, probablemente no te preocupes demasiado por los 2Mb.

Si habrá cientos de millones de instancias en la memoria, los ahorros van a ser bastante grandes, pero si ese es el caso, es posible que no tenga suficiente memoria RAM para manejarlo y es posible que tenga que almacenar esta estructura en disco y trabajar con partes de él a la vez.

0

Int32 estará bien para casi cualquier cosa. Las excepciones incluyen:

  • si tiene necesidades específicas donde un tipo diferente es claramente mejor. Ejemplo: si usted está escribiendo un emulador de 16 bits, Int16 (aka: short) probablemente sería mejor para representar algunas de las partes internas
  • cuando una API requiere un cierto tipo
  • una vez, tuve un inválido int fundido y la primera sugerencia de Visual Studio fue verificar que mi valor fuera menor que el infinito. No pude encontrar un buen tipo para eso sin usar las constantes predefinidas, así que usé ulong ya que era lo más cercano que podía entrar en .NET 2.0 :)
Cuestiones relacionadas