2009-04-22 14 views
9

Esto puede parecer una pregunta realmente estúpida, pero ¿cuál es el costo de incluir (en realidad, llamar al #import) un archivo de encabezado en Objective-C? Me cansé de incluir constantemente los mismos encabezados en varias ubicaciones, así que decidí simplemente crear un archivo GlobalReferences.h que incluye varios encabezados comúnmente referenciados.Costo de incluir archivos de encabezado en Objective-C

¿Hay algún costo apreciable por incluir referencias a otros archivos si ni siquiera se utilizan? Mi instinto me dice "no", ya que parece que el vinculador acaba de conocer otros archivos al usar #import, pero no estaba seguro de si se deben tomar consideraciones especiales para el desarrollo del iPhone, que es lo que concierne a mi proyecto. ¿Alguna idea?

Respuesta

7

El enlazador no sabe nada sobre #import archivos ed. De hecho, el compilador de Objective-C tampoco sabe nada de ellos, son preprocesados ​​por el preprocesador. El preprocesador inserta efectivamente el contenido de los encabezados en el punto que los incluyó en su archivo fuente. El compilador de Objective-C real tendrá que procesar prototipos de funciones adicionales y definiciones de interfaz de clase aunque no se estén utilizando. Aunque esto no suele ser una tarea larga, puede aumentar los tiempos de compilación. El tamaño y el rendimiento resultantes de su aplicación no deberían verse afectados.

para ver lo que el código fuente en bruto se parece (incluyendo todos los archivos de cabecera y las macros expandidas etc):

gcc -E your-source-file.m 
+0

Gracias por aclarar esto. – LucasTizma

2

El mayor inconveniente estará en tiempos de compilación. Si todos sus encabezados se importan en cada archivo de origen, el proyecto completo deberá reconstruirse cada vez que realice un cambio en un archivo de encabezado.

3

La importación/inclusión de más archivos de encabezado de los necesarios aumentará los tiempos de compilación. Puede aliviar algo de este dolor con pre-compiled headers.

0

seguir adelante y hacerlo él. A menos que los encabezados que estás incluyendo sean masivos y no estés usando encabezados precompilados, no deberías ver ninguna diferencia. Como han dicho otros, #import es una directiva de preprocesador. Esto no tiene consecuencias en el tiempo de ejecución y en muchos casos no tiene consecuencias importantes en el tiempo de compilación.

+0

Gracias a todos por sus aclaraciones sobre este tema. – LucasTizma

1

¿Cuál es el costo de incluir (en realidad, invocando a #import) un archivo de encabezado en Objective-C?

El compilador puede quedarse sin leer estos archivos innecesariamente. Una vez que #import ed, los archivos adicionales necesitarán ser analizados, compilados, etc. para cada traducción (por ejemplo, archivo .m) es visible en - hacer su construcción y los tiempos de enlace mucho más tiempo. 10 veces más es no sorprendente.

Me canso de incluir constantemente los mismos encabezados en varias ubicaciones, así que decidí simplemente crear un archivo GlobalReferences.h que incluye varios encabezados comúnmente referenciados.

Normalmente, ese es un enfoque muy malo. El problema común es que cada vez que se cambia alguno de los archivos incluidos por GlobalReferences.h, todo su proyecto y todas las dependencias intermedias tendrían que reconstruirse, volver a vincularse, etc.

Mi preferencia es separar programas en pequeñas bibliotecas o paquetes donde existe esta interdependencia (por ejemplo, StoreKit.framework es un pequeño paquete/biblioteca) - pero rellenar esas bibliotecas/marcos/paquetes en encabezados no resuelve nada. Además, reenviar declaraciones y almacenar sus datos en la continuación de la clase o @implementation pueden reducir significativamente las dependencias (porque puede localizar la inclusión de una biblioteca/encabezado solo en las traducciones necesarias).

Por último, la limpieza después de lazy incluye consume mucho tiempo, especialmente cuando hay muchos y has esperado hasta que los tiempos de compilación de tu proyecto sean insoportablemente lentos. Básicamente, debe volver atrás y separar dependencias innecesarias, reconstruir, repetir (durante días).

¿Hay algún costo apreciable por incluir referencias a otros archivos si ni siquiera se utilizan?

Absolutamente. Cuanto más crecen tus proyectos, peor se vuelve la inclusión perezosa. Unas pocas inclusiones perezosas en un proyecto grande podrían agregar decenas o cientos de miles de líneas a la mayoría de sus archivos compilados, y pueden desencadenar la recopilación frecuente de muchas fuentes. Esto agrega una cantidad significativa de complejidad al proceso de compilación: las demandas de la CPU van en aumento, el uso de la RAM sube, el disco IO sube ... y nuevamente, esto se convierte en un problema mayor a medida que sus bases de datos/proyectos aumentan en complejidad.

Cuestiones relacionadas