2011-01-09 9 views
6

Esta pregunta se ha hecho hasta la muerte, y estoy de acuerdo en que las enumeraciones son el camino a seguir. Sin embargo, tengo curiosidad por saber cómo compilan las enumeraciones en el código final: las definiciones # son solo reemplazos de cadenas, pero ¿las enumeraciones añaden algo al binario compilado? O ambos son equivalentes en esa etapa. Cuando escribir firmware y la memoria es muy limitado, ¿hay alguna ventaja, sin importar cuán pequeña, para usar #defines?#define vs enum en un entorno incrustado (¿Cómo compilan?)

Gracias!

EDITAR: Según lo solicitado por el comentario a continuación, por incrustado, me refiero a una cámara digital.

Gracias por las respuestas! ¡Estoy todo por enumeraciones!

+2

"Embebido" puede significar cualquier cosa, desde un Nexus S hasta un sistema de aviónica. Debería restringirlo (qué chip, qué compilador, ¿qué versión?) Si quiere una respuesta significativa. Estoy de acuerdo con los contestadores que * deberían * ser tratados de forma similar a un 'const'. –

+1

@Matthew: Creo que estás pensando en C++. En C, '# define' y' enum' pueden crear expresiones constantes, pero una variable 'const' nunca es una expresión constante, y para acceder a ella seguramente incurrirá en tamaño de código real y penalizaciones de rendimiento (cargando desde la memoria). –

+0

@R, tiene razón acerca de que 'const' no es una expresión const en C99 (y necesito leer sobre esto). Pero en casos simples, el compilador aún puede evitar asignar memoria para ellos. Por ejemplo, si pongo 'const int a = 1;' en un encabezado, entonces 'int b = a;' en main, el compilador * puede * ser lo suficientemente inteligente como para no asignar memoria para 'a'. –

Respuesta

10

Ambos son expresiones constantes en la terminología de la norma, por lo que "debería" ser evaluado completamente en tiempo de compilación por cualquier compilador cuerdo. Tomaría un compilador maliciosamente patológico para generar código diferente.

+1

no son solo * expresiones constantes * sino * expresiones constantes enteras * en la terminología del estándar. La diferencia es importante aquí, ya que para la primera, por ejemplo, una constante de dirección también calificaría. Solo al ser el último, pueden aparecer en declaraciones de tipo y para la definición de otras constantes 'enum'. Y utilizados como longitud de matriz, hacen la diferencia entre las matrices simples y VLA. –

5

Un enum es solo un número entero, en última instancia. El compilador propaga los valores, tal como lo haría con un const.

+1

un valor 'enum' es * expresión constante *, mientras que una variable' const' (en C) no lo es y, por lo tanto, no se puede usar para la inicialización estática, etiquetas 'case', ...; un valor 'enum' es una constante de tiempo de compilación, una variable 'const' es una constante de tiempo de ejecución (desde la perspectiva del lenguaje - el compilador es libre de hacer propagación constante para las variables' const') – Christoph

4

Es imposible decir sin perfilar o medir de alguna otra manera.

PERO, cualquier compilador decente no mostrará ninguna diferencia significativa. Además, siempre deberías preferir el código legible y seguro a un código más eficiente, ilegible y lleno de errores. No comenzar a optimizar la eficiencia sobre la legibilidad hasta que haya demostrado dos cosas:

  1. que realmente necesita el impulso de la eficiencia
  2. la parte del programa que se está cambiando se ha demostrado que es un cuello de botella por un generador de perfiles .
+1

Estoy completamente de acuerdo contigo sobre optimización innecesaria! Acabo de unirme a un proyecto y #define se estaba utilizando, por lo que me preguntaba si podría haber un motivo de eficiencia. –

+0

En este caso, probablemente no necesite hacer perfiles y mediciones como tal; basta con observar el conjunto generado, que debería ser idéntico. –

+0

@Brooks sí. editado para reflejar esto. –