2011-01-19 126 views
5

你可以声明功能类似这样的内联:我可以在Objective-C中内联静态类方法吗?

#ifdef DEBUG 
void DPrintf(NSString *fmt,...); 
#else 
inline void DPrintf(NSString *fmt,...) {} 
#endif 

,这样当你在DEBUG不是,也因为它的优化和内联是没有成本的功能。如果你想拥有相同的东西,但是对于类方法呢?

我的类声明如下:

@interface MyClass : NSObject { 

} 

    + (void)DPrintf:(NSString *)format, ...; 
    // Other methods of this class 
@end 

我想转换“DPrintf”成类似inline东西,所以,有没有成本调用方法。

但我不能这样做:

inline +(void)DPrintf:(NSString *)format, ...; {} 

我怎么能有一类是零成本的静态方法关闭了非调试编译?

回答

8

要小心。 Objective-C方法与C函数不同。 Objective-C方法被编译器翻译为objc_msgSend()函数调用;您无法控制某个方法是否内联,因为这是无关紧要的。您可以阅读有关Objective-C运行时间here (Objective-C Runtime Programming Guide),here (Objective-C Runtime Reference)here (CocoaSamurai post)的更多信息,而快速Google搜索应该会显示更多信息。

+4

另外,要小心不成熟的优化。即使函数被称为很多,在打印内容的函数上进行内联标记也不会节省太多时间。内联大多只有在返回非常容易计算的情况下才有意义,所以函数调用开销很大。根据所调用的指令数量,不涉及printf的任何变体。 – 2011-01-19 21:48:55

+4

除了今天,大多数现代编译器(无论是GCC还是Clang)一般都知道如何识别自己内联的函数,并将其标记为自己。人们在估计哪些函数很好地工作在线时是非常糟糕的,所以建议你只留下一点让编译器弄清楚(我听说过一些C编译器甚至会忽略你是否将函数标记为内联或者不内联,因此应该警惕)。 – 2011-01-19 21:54:11

6

Objective-C中没有这样的静态方法。只有类方法,就像实例方法一样,除了它们属于一个类。这意味着,就像实例方法一样,发送给类的消息必须通过消息调度机制来确定调用的正确方法,并且这是在运行时完成的。您可以内联调用方法调度机制,但如果没有目前任何Objective-C编译器中不存在的疯狂优化级别,方法体仍不能内联。

无论如何,这是一个微型优化。如果分析表明它是必要的(它几乎从不会),那么你可以通过体操。否则,担心应用程序中的实际性能问题。

相关问题