Se puede declarar como funciones inline como este:¿Puedo aplicar métodos de clase estática en línea en Objective-C?
#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
de modo que cuando no estás en DEBUG, no hay ningún costo para la función porque está optimizado y en línea. ¿Qué pasa si quieres tener lo mismo pero para un método de clase?
Mi clase se declara así:
@interface MyClass : NSObject {
}
+ (void)DPrintf:(NSString *)format, ...;
// Other methods of this class
@end
Quiero cambiar 'DPrintf
' en algo similar a la inline
de manera que no hay ningún costo para invocar el método.
Pero no puedo hacer esto:
inline +(void)DPrintf:(NSString *)format, ...; {}
¿Cómo puedo tener un método estático de costo cero de una clase apagado para las compilaciones de no depuración?
Además, tenga cuidado con la optimización prematura. No es probable que una marca en línea de una función que está imprimiendo cosas ahorre mucho tiempo, incluso si la función se llama mucho. La mayoría de las veces solo tiene sentido cuando el retorno es muy fácil de calcular, por lo que la sobrecarga de llamada a la función es significativa. Nada que implique una variación de printf es fácil en términos de número de instrucciones llamadas. –
Además del hecho de que hoy en día, la mayoría de los compiladores modernos (ya sean GCC o Clang) generalmente saben cómo reconocer funciones que funcionan bien en línea por sí mismas, y los marcarán ellos mismos como tales. Los humanos son notoriamente malos a la hora de estimar qué funciones funcionan bien en línea, por lo que se recomienda dejarlo solo para que el compilador lo descubra (he oído hablar de algunos compiladores C que incluso ignorarán si marca funciones como en línea o no, así que sea cauteloso). –