Pregunta

MSDN dice que una clase que sería de 16 bytes o menos sería mejor manejado como una estructura [cita] .
¿Por qué?
¿Eso quiere decir que si una estructura es más de 16 bytes que es menos eficiente que una clase o se trata de la misma?
¿Cómo se determina si la clase es menor de 16 bytes?
Lo que restringe una estructura de actuar como una clase? (Además de no permitir constructores sin parámetros)

¿Fue útil?

Solución

Hay un par de diferentes respuestas a esta pregunta, y es un poco subjetivo, pero algunas de las razones que se me ocurren son:

  • Las estructuras son de tipo de valor, las clases son tipo de referencia. Si usted está usando 16 bytes para almacenamiento total, es probable que no vale la pena para crear referencias a memoria (de 4 a 8 bytes) para cada uno.
  • Cuando tiene objetos muy pequeños, que a menudo pueden ser inserta en la pila IL, en lugar de referencias a los objetos. Esto realmente puede acelerar un poco de código, ya que está eliminando una falta de referencia de memoria en el lado del abonado llamado.
  • Hay un poco de "pelusa" adicional asociado con las clases en IL, y si la estructura de datos es muy pequeño, nada de esto pelusa sería utilizado de todos modos, por lo que es sólo basura extra que no necesita.

La diferencia más importante entre una estructura y una clase, sin embargo, es que las estructuras son de tipo de valor y las clases son de tipo de referencia.

Otros consejos

Por "eficiente", es probable que estén hablando de la cantidad de memoria que se necesita para representar a la clase o estructura.

En la plataforma de 32 bits, la asignación de un objeto requiere un mínimo de 16 bytes. En una plataforma de 64 bits, el tamaño mínimo de objeto es de 24 bytes. Por lo tanto, si usted está buscando en que sólo a partir de la cantidad de memoria utilizada, una estructura que contiene menos de 16 bytes de datos será "mejor" que la clase correspondiente.

Sin embargo, la cantidad de memoria utilizada no es toda la historia. Los tipos de valor (estructuras) son fundamentalmente diferentes de los tipos de referencia (clases). Las estructuras puede ser un inconveniente para trabajar con, y realmente puede causar problemas de rendimiento si no tiene cuidado.

La verdadera respuesta, por supuesto, es utilizar lo que funciona mejor en su situación. En la mayoría de los casos, será mucho mejor usar clases.

Comprobar este enlace, me encontré en una de las respuestas en la actualidad: . NET Tipo Internos . También puede tratar de buscar SO y Google para "tipos de referencia frente a los tipos de valor" para las diferencias entre estructuras y clases.

  
    

Lo que restringe una estructura de actuar como una clase?

  

Hay muchas diferencias. No se puede heredar de una estructura, por ejemplo.

No se puede tener métodos virtuales, por lo que no puede utilizar una estructura para implementar una interfaz. Los métodos de instancia en estructuras pueden tener acceso a los campos privados de estructura, pero aparte de eso se comportan mucho como funciones auxilirary "ayudantes" (para estructuras inmutables, que a veces ni siquiera necesita acceder a los datos privados). Así que parece que sean no tan cerca como "valiosa", como los métodos de clase.

Esto es debido a la diferente forma en que el CLR maneja estructuras y clases. Las estructuras son tipos de valor que significa que viven en la pila en lugar de en el montón administrado. Es una buena regla de oro para mantener estructuras pequeñas, porque una vez que comience pasarlos como argumentos del método en que incurrirá por encima mientras que las estructuras son copiados en su totalidad cuando se pasa a un método.

Desde clases pasan una copia de su referencia a los métodos en que incurran mucho menos sobrecarga cuando se usa como argumentos del método.

La mejor manera de determinar el tamaño de su clase es para totalizar el número de bytes requeridos por todos los miembros de su clase, además de un extra de 8 bytes para las cosas de arriba CLR (el índice de bloques de sincronización y la referencia al tipo de la objeto).

Las estructuras son diferentes de las clases ya que se almacenan en la pila, y no en el montón. Eso significa que cada vez que se llama a un método con la estructura como parámetro, se crea una copia y pasa al método. Es por eso que las grandes estructuras son extremadamente ineficiente.

Me desalentar activamente a utilizar estructuras, sin embargo, ya que podría causar algunos errores sutiles: por ejemplo, cuando se cambia un campo de una estructura, no va a ser reflejada por la persona que llama (ya que sólo cambió la copia.) - que es un comportamiento completamente diferente a las clases

Así que los 16 bytes creo que es un tamaño máximo razonable de una estructura, pero todavía en la mayoría de los casos, es mejor tener una clase. Si aún desea crear una estructura, tratar de hacer que al menos inmutable.

En la memoria, la estructura va a contener los datos directamente, mientras que una clase se comporta más como un puntero. Esto convierte a una diferencia importante, ya que pasa la struct como un parámetro a un método pasará sus valores (copiarlos en la pila), mientras que la clase pasará la referencia a los valores. Si la estructura es grande, se va a copiar una gran cantidad de valores en cada llamada al método. Cuando es muy pequeño copiando los valores y usarlos directamente será probablemente más rápido que copiar el puntero y tener que agarrarlos de otro lugar.

Acerca de las restricciones:. No se puede asignar a NULL (aunque se puede utilizar anulable <>) y tiene que inicializar de inmediato

Copia de una instancia de una estructura lleva menos tiempo que la creación de una nueva instancia de una clase de datos y copia de un viejo, pero las instancias de clase pueden ser compartidos y struct casos no pueden. Por lo tanto, "structvar1 = structvar2" requiere la copia nueva instancia struct, mientras que "classvar1 = classvar2" permite classvar1 y classvar2 referirse a la misma instancia struct (sin tener que crear una nueva).

El código para controlar la creación de nuevas instancias struct está optimizado para tamaños de hasta 16 bytes. estructuras más grandes son manejados de manera menos eficiente. Las estructuras son una victoria en los casos en cada variable que contiene una estructura llevará a cabo una instancia independiente (es decir, no hay razón para esperar que cualquier par de variables particulares sostendrán instancias idénticas); ellos no son mucho de una victoria (si son una victoria en absoluto) en los casos en que muchas variables podrían ser la misma instancia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top