Para definir las constantes, ¿cuál es la forma más común y correcta? ¿Cuál es el costo, en términos de compilación, vinculación, etc., de definir constantes con #define? Es otra forma menos costosa?¿Cuál es el costo de un #define?
Respuesta
La mejor manera de definir cualquier const es escribir
const int m = 7;
const float pi = 3.1415926f;
const char x = 'F';
Usando #define
es un mal estilo ++ c. Es imposible ocultar #define
en el ámbito del espacio de nombres.
Compare
#define pi 3.1415926
con
namespace myscope {
const float pi = 3.1415926f;
}
segunda forma es obviamente mejor.
+1 '# define' también es un estilo pobre porque no proporciona ninguna información de tipo explícita al compilador. – GrahamS
Esto resume con precisión las recomendaciones estilísticas pero no responde la pregunta. Las constantes declaradas en el estilo correcto de C++ tienen un costo que #defines no tienen. –
@Dan Olson: Aah pero #defines también tienen un costo en términos de tamaño del código, ya que (dependiendo de la inteligencia del compilador) puedes terminar introduciendo muchos literales donde hubiera sido un const individual. @Espuz: ninguno de los costos vale la pena preocuparse (a menos que esté haciendo cosas de microprocesador de muy bajo nivel), así que vaya con el mejor estilo, que es 'const' siempre que sea posible. – GrahamS
El costo es solo para el preprocesador, cuando #defines se resuelven (ignorando el costo adicional de depuración de tratar con un proyecto lleno de #defines para constantes, por supuesto).
#define
es un reemplazo de cadena. Entonces, si comete errores en las macros, aparecerán como errores más adelante. La mayoría de los tipos incorrectos o expresiones incorrectas son los más comunes.
Para la compilación condicional, las macros del preprocesador funcionan mejor. Para otras constantes que se utilizarán en el cálculo, const
funciona bien.
#define
Las macros son procesadas por el preprocesador, no son visibles para el compilador. Y dado que no son visibles para el compilador como un símbolo, es difícil depurar algo que involucra una macro.
La forma preferida de definir las constantes es usar la palabra clave const junto con la información de tipo adecuada.
const unsigned int ArraySize = 100;
Aún mejor es
static const unsigned int ArraySize = 100;
cuando la constante se utiliza sólo en un único archivo.
#define aumentará el tiempo de compilación pero lo hará más rápido en la ejecución ...
generalmente en #define compilación condicional se utiliza ...
donde const se utiliza en el cálculo general de los números
La elección depende de su requisito ...
En el mejor de los casos, el aumento de velocidad con #define será marginal. Si el compilador optimiza las ventajas no habrá ninguna ventaja y perderá todos los beneficios de const. – JeremyP
sí ... #define es útil en la compilación condicional (en aplicaciones multiplataforma ...) Es la única ventaja que se puede considerar ... –
El compilador nunca ve un #define. El preprocesador expande todas las macros antes de pasarlas al compilador. Uno de los efectos secundarios, sin embargo, es que los valores se repiten ... y dos cadenas idénticas no son necesariamente la misma cadena exacta. Si usted dice
#define SOME_STRING "Just an example"
es perfectamente legal para el compilador para añadir una copia de la cadena en el fichero de salida cada vez que se ve la cadena. Un buen compilador probablemente elimine los literales duplicados, pero eso es trabajo extra que tiene que hacer. Si usa un const en su lugar, el compilador no tiene que preocuparse tanto por eso.
El tiempo de CPU no es realmente el costo de usar #define o macros. El "costo" como desarrollador es el siguiente:
- Si hay un error en la macro, el compilador lo marcará donde hizo referencia a la macro, no donde la definió.
- Perderá seguridad de tipo y alcance para su macro.
- Las herramientas de depuración no conocerán el valor de la macro.
Estos elementos pueden no grabar los ciclos de CPU, pero pueden quemar ciclos de desarrollador.
Para las constantes, es preferible declarar las variables const
, y para las funciones poco independientes del tipo, son preferibles las funciones en línea y las plantillas.
- 1. ¿Cuál es el costo de '$ (this)'?
- 2. ¿Cuál es el costo de llamar Array.length
- 3. ¿Cuál es el costo general de un vector vacío?
- 4. ¿Cuál es el costo de rendimiento de llamar a Thread.isInterrupted()?
- 5. ¿Cuál es el costo de los parámetros de colada
- 6. ¿Cuál es el costo de entrada/membresía en Android Marketplace?
- 7. ¿Cuál es el "costo" de la reflexión .NET?
- 8. ¿Cuál es el costo del acceso a la memoria?
- 9. ¿Cuál es el significado de #define en el objetivo C?
- 10. ¿Cuál es el propósito de la directiva #define en C++?
- 11. ¿Cuál es el costo de rendimiento de asignar un único valor de cadena usando + '
- 12. ¿Cuál es el costo de memoria de un DataSet frente a otras clases de .Net Collection?
- 13. ¿Cuál es el "costo" aproximado de un subproceso en ciclos de CPU y memoria?
- 14. ¿Cuál es el costo de la palabra clave volátil en un sistema multiprocesador?
- 15. ¿Cuál es el costo de almacenamiento de una primitiva en caja en Java?
- 16. ¿Cuál es el costo de las referencias de ensamblaje no utilizadas?
- 17. Costo de desarrollo versus costo de mantenimiento
- 18. ¿Hay un costo para usar NSLog liberalmente?
- 19. El costo de consulta relativo al lote es 100%
- 20. ¿Cuál es la diferencia entre existe y se define?
- 21. ¿Cuál es la diferencia entre% define y equ en NASM?
- 22. Problema de ruta en un gráfico: minimizar el costo marginal promedio en lugar del costo total
- 23. costo de operación atómica
- 24. ¿Cuál es el costo (en ciclos) para cambiar entre el kernel de Windows y el modo de usuario?
- 25. ¿Tiene un getter cero costo?
- 26. Implementaciones de colecciones de Java (por ejemplo, HashMaps vs HashSet vs HashTable ...), ¿cuál es el costo de elegir el incorrecto?
- 27. ¿Es seguro asumir generalmente que toString() tiene un costo bajo?
- 28. ¿Cuál es el propósito de estos #define dentro de una enumeración?
- 29. enum o define, ¿cuál debo usar?
- 30. ¿Cuál es el significado de O (polylog (n))? En particular, ¿cómo se define polylog (n)?
Elija un idioma, cualquier idioma? –
@Kyle: mira las etiquetas. – Cam
C# no permite que '# define' se use para definir constantes. Puede hacer '#define DEBUG', pero no' #define DEBUG 1'. http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –