2012-04-21 9 views
17

Considerando la definizione di NS_INLINE sembra che il vantaggio di utilizzarlo su static inline sia compatibile con il compilatore, è corretto? Dovrebbe essere sempre utilizzato NS_INLINE invece di static inline sulle funzioni c nei progetti obiettivo-c?Qual è il vantaggio di NS_INLINE rispetto a quello statico in linea?

#if !defined(NS_INLINE) 
    #if defined(__GNUC__) 
     #define NS_INLINE static __inline__ __attribute__((always_inline)) 
    #elif defined(__MWERKS__) || defined(__cplusplus) 
     #define NS_INLINE static inline 
    #elif defined(_MSC_VER) 
     #define NS_INLINE static __inline 
    #elif TARGET_OS_WIN32 
     #define NS_INLINE static __inline__ 
    #endif 
#endif 

risposta

10

Sì, è per compatibilità con il compilatore, ma penso che sia più per l'utilizzo dei framework che per il proprio codice. Ovviamente sei libero di usarlo, ma non mi preoccuperei.

+0

E se il codice fosse per una libreria usata da altri, consiglieresti di usare 'NS_INLINE' allora? – keegan3d

+3

Sta per essere utilizzato su piattaforme diverse da quelle di Apple? Con GnuStep o qualcosa di simile? Se no, allora no. C'è approssimativamente zero possibilità che lo sviluppo per Mac OS X o iOS sarà mai incompatibile con 'static inline'. –

21

Osservando la definizione di NS_INLINE sembra che il vantaggio di utilizzarlo su linea statica sia compatibile con il compilatore, è corretto?

Solo in parte. È necessario valutare la toolchain dominante qui e chiedere "perché è stato utilizzato static inlinenon o perché è stato inadeguato?". La toolchain dominante contiene l'attributo __attribute__((always_inline)). Quindi ci sono davvero due parti:

  • a) Compatibilità In tal modo aggiunge compatibilità per più compilatori.

  • b) Uso di __attribute__((always_inline)) nella toolchain dominante. inline ha devoluto per essere una semplice richiesta a inline. Con always_inline, il compilatore può comunque riservarsi il diritto di non integrare la funzione (per ovvi motivi). Tuttavia, dice anche "fidati di me, voglio questo compilatore inline, inline questo se possibile". Questo attributo ripristina alcune delle capacità di inline al programmatore. Questo può essere usato per le prestazioni, ma sospetto (in questo caso) che abbia più a che fare con la riduzione del numero di funzioni private esportate, piuttosto che con i requisiti di prestazione.

caso NS_INLINE sempre essere usato al posto di linea statica in progetti di Objective-C?

n. __attribute__((always_inline)) deve essere riservato a persone che hanno avuto molta esperienza nell'ottimizzare i programmi e con l'uso di questa funzione. Questo attributo può essere applicato a funzioni C, metodi C++ e altre chiamate statiche. Non può essere applicato alla classe ObjC o ai metodi di istanza (che sono dinamici). Lo dico perché il compilatore, l'ottimizzatore e LTO sono molto bravi in ​​quello che fanno. Nel frattempo, l'uso improprio di inlining può avere (nessuna) diverse penalizzazioni prestazionali. L'eccezione (per le persone che non hanno speso molto tempo ad ottimizzare) è ovviamente quando ci si prende il tempo per misurare le differenze che fa.

+0

Grazie, molto approfondito! Ho aggiornato la mia domanda per chiarire che sto parlando di funzioni c in un progetto obiettivo-c. – keegan3d

+3

@ keegan3d prego. in effetti, pensavo che lo stavi applicando ai simboli giusti. ho menzionato i metodi objc come una nota a margine (ad esempio per ogni lettore). tuttavia, il punto più grande che cercavo * di fare era che ci fossero buoni ottimizzatori nella toolchain e progressi relativamente recenti nell'ottimizzazione (ad es. LTO di clang) che consentono un'ottimizzazione molto aggressiva di molti simboli C e C++ - anche quando il le definizioni non sono visibili al compilatore.questi avanzamenti aumentano ulteriormente la difficoltà di accordatura manuale con successo (ad esempio l'uso di "__attribute __ ((sempre_inline))'). – justin

+0

E la nuova macro 'FOUNDATION_STATIC_INLINE'? Questo è appena definito come 'statico __inline__'. Posso usare quello, cioè, 'statico __inline__' lo stesso di' statico inline'? – ma11hew28

Problemi correlati