我可以在Objective-C中内联静态类方法吗?

Jon*_*son 5 methods inline objective-c

您可以将函数声明为如下内联:

#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
Run Code Online (Sandbox Code Playgroud)

因此,当您不在DEBUG中时,该功能不会产生任何成本,因为它已经过优化和内联.如果你想拥有相同的东西但是对于类方法怎么办?

我的类声明如下:

@interface MyClass : NSObject {

}

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

我想将' DPrintf'转换为类似的东西,inline以便调用该方法没有成本.

但我不能这样做:

inline +(void)DPrintf:(NSString *)format, ...; {}
Run Code Online (Sandbox Code Playgroud)

如何为非调试编译关闭类的零成本静态方法?

Ita*_*ber 9

小心.Objective-C方法与C函数不同.Objective-C方法由编译器转换为objc_msgSend()函数调用; 您无法控制方法是否内联,因为这是无关紧要的.您可以在此处阅读有关Objective-C运行时的更多信息(Objective-C运行时编程指南),此处(Objective-C运行时参考)此处(CocoaSamurai帖子),快速Google搜索应该会提供更多信息.

  • 另外,要注意过早优化.即使函数被大量调用,对函数进行内联标记也不太可能节省很多时间.内联通常只有在返回非常容易计算的情况下才有意义,因此函数调用开销很大.在所谓的指令数量方面,任何涉及printf变化的内容都不容易. (4认同)
  • 除了今天的事实,大多数现代编译器(无论是GCC还是Clang)通常都知道如何识别自身内联功能良好的功能,并将自己标记为这些功能.众所周知,人们在估计哪些函数在内联中运行良好是非常糟糕的,所以建议你只留下它让编译器搞清楚(我听说过一些C编译器甚至会忽略你是否将函数标记为内联函数,所以警惕). (4认同)

Chu*_*uck 7

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

无论如何,这是微观优化.如果剖析显示它是必要的(它几乎不会),那么你可以通过体操.否则,请担心应用程序中的实际性能问题.

  • 对于那些(类似于我)来自Java背景的类方法和静态方法是同义词的人,请注意在Objective-C类方法中是动态解析的 - 对类对象进行操作,这就是它们不是"静态"的原因.http://en.wikipedia.org/wiki/Method_(computer_programming) (3认同)