2009-04-22 21 views
9

Questa può sembrare una domanda davvero stupida, ma qual è il costo di includere (in realtà, chiamando #import) un file di intestazione in Objective-C? Mi stanco di includere costantemente le stesse intestazioni in varie posizioni, quindi ho deciso di creare semplicemente un file GlobalReferences.h che include diverse intestazioni con riferimenti comuni.Costi di inclusione di file di intestazione in Objective-C

C'è qualche costo apprezzabile per includere riferimenti ad altri file se non vengono nemmeno utilizzati? Il mio istinto mi dice "no" perché sembra che il linker sia appena stato informato di altri file quando si utilizza #import, ma non ero sicuro che occorressero considerazioni speciali per lo sviluppo di iPhone, che è ciò che riguarda il mio progetto. qualche idea?

risposta

7

Il linker non sa nulla dei file #import ed. In effetti, il compilatore Objective-C non ne sa nulla, sono pre-elaborati dal preprocessore. Il preprocessore inserisce efficacemente i contenuti delle intestazioni nel punto in cui li hai inclusi nel tuo file sorgente. L'attuale compilatore Objective-C dovrà quindi elaborare prototipi di funzioni extra e definizioni di interfacce di classe anche se non vengono utilizzati. Sebbene di solito non sia un compito lungo, può aumentare i tempi di compilazione. La dimensione e le prestazioni risultanti della tua applicazione dovrebbero rimanere inalterate.

vedere ciò che il codice sorgente grezzo assomiglia (inclusi tutti i file di intestazione e macro espanso, ecc):

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

Grazie per averlo chiarito. – LucasTizma

2

Il più grande svantaggio sarà in tempi di compilazione. Se tutte le intestazioni sono importate in ogni file sorgente, il progetto intero dovrà essere ricostruito ogni volta che si apporta una modifica a un file di intestazione.

3

Importare/includere più file di intestazione di quanto necessario aumenterà i tempi di compilazione. Puoi alleviare parte di questo dolore con pre-compiled headers.

0

andare avanti e farlo esso. A meno che le intestazioni che stai includendo siano enormi e non utilizzi intestazioni precompilate, non dovresti notare alcuna differenza. Come altri hanno già detto, #import è una direttiva preprocessore. Ciò non ha conseguenze di runtime e in molti casi non ha conseguenze significative in termini di tempo di compilazione.

+0

Grazie a tutti per i chiarimenti su questo problema. – LucasTizma

1

qual è il costo di includere (in realtà, chiamando #import) un file di intestazione in Objective-C?

Il compilatore può esaurirsi per leggere questi file inutilmente. Una volta #import ed, i file aggiuntivi dovranno essere analizzati, compilati, ecc. Per ogni traduzione (ad esempio il file .m) in cui è visibile - rendendo i tempi di costruzione e collegamento molto più lunghi. 10 volte più lungo è non sorprendente.

Mi sono stancato di includere costantemente le stesse intestazioni in varie posizioni, quindi ho deciso di creare semplicemente un file GlobalReferences.h che includa diverse intestazioni di riferimento comune.

In genere, si tratta di un approccio molto negativo. Il problema comune è che ogni volta che uno qualsiasi dei file inclusi da GlobalReferences.h viene modificato, l'intero progetto e tutte le dipendenze intermedie devono essere ricostruite, ricollegate, ecc.

La mia preferenza è di separare i programmi in piccole librerie o pacchetti in cui esiste questa interdipendenza (ad esempio StoreKit.framework è un piccolo pacchetto/libreria), ma il riempimento di tali librerie/framework/pacchetti nelle intestazioni non risolve nulla. Inoltre, le dichiarazioni di inoltro e l'archiviazione dei dati nella continuazione della classe o @implementation possono ridurre significativamente le dipendenze (poiché è possibile localizzare l'inclusione di una libreria/intestazione solo per le traduzioni necessarie).

Infine, ripulire dopo pigro include molto tempo, soprattutto quando ce ne sono molti e hai aspettato fino a quando i tempi di costruzione del tuo progetto sono insopportabilmente lenti. Fondamentalmente, devi tornare indietro e scegliere le dipendenze non necessarie, ricostruire, ripetere (per giorni).

C'è qualche costo apprezzabile per includere riferimenti ad altri file se non vengono nemmeno utilizzati?

Assolutamente. Più i tuoi progetti crescono, peggiore diventa l'inclusione pigra. Alcune persone pigre includono un grande progetto che potrebbe aggiungere decine o centinaia di migliaia di linee alla maggior parte dei tuoi file compilati e può innescare la frequente ricompilazione di molte fonti. Ciò aggiunge una notevole quantità di complessità al processo di compilazione: le richieste della CPU vanno al rialzo, l'utilizzo della RAM aumenta, l'I/O del disco aumenta ... e ancora, questo diventa un problema più grande man mano che i database/progetti aumentano di complessità.

Problemi correlati