次のようなインラインとして関数を宣言することができます:あなたはDEBUGにいないとき、それを最適化し、インラインているため、機能に費用はかかりません。Objective-Cで静的クラスメソッドをインライン化できますか?
#ifdef DEBUG
void DPrintf(NSString *fmt,...);
#else
inline void DPrintf(NSString *fmt,...) {}
#endif
ように。あなたは同じことをしたいが、クラスメソッドの場合はどうですか?
私のクラスは、このように宣言されています
@interface MyClass : NSObject {
}
+ (void)DPrintf:(NSString *)format, ...;
// Other methods of this class
@end
私はメソッドを呼び出すに費用はかかりませんようにinline
に似たものに「DPrintf
」を変換したいです。
しかし、私はこれを行うことはできません。
inline +(void)DPrintf:(NSString *)format, ...; {}
は、どのように私は非デバッグコンパイルのためにオフになったクラスのゼロコストの静的メソッドを持つことができますか?
また、時期尚早の最適化に注意してください。印刷物である関数のインラインマーキングは、たとえその関数が多く呼び出されても、時間を節約することはできません。インライン化は、リターンが非常に計算が簡単な場合にのみ意味があります。そのため、関数呼び出しのオーバーヘッドは重要です。 printfのバリエーションを何も伴わないものは、呼び出される命令の数の面で簡単です。 –
今日、最も現代的なコンパイラ(GCCかClangのいずれか)は、インラインでうまく機能する関数を認識する方法を一般に知っており、それ自体をそのようにマークします。コンパイラがインラインで関数をマークするかどうかを無視するCコンパイラもあると聞いたことがあるので、コンパイラがそれをそのままにしておくことをお勧めします。注意してください)。 –