2

I'm working on an iOS app using C and Objective-C, and I want to write a very small piece of code that will be executed thousands of times from more than one place. Is it safe to make this an inline function and be sure that it will always be expanded (I won't ever be taking its address) or should I make it a macro? The code is small and it will be executed very frequently, so I'd like to make sure I won't end up with thousands of function calls for it, but still I'd like the type safety of the function approach if possible...

4

3 に答える 3

4

関数がインライン化されていることを確認したい場合は、それを「外部インライン」にします(これはGNU-Cの機能です)。このような関数は、インライン化にのみ使用されます。コンパイラは、そのための「実際の」関数を生成することはありません。したがって、インライン化が失敗した場合は、リンカーエラーが発生するはずです。clangはこの機能を「継承」していると思います。

一般に、可能であれば、マクロではなく常にインラインを使用します。多くのCコンパイラが長年にわたってそれを持っていたのには理由があり、C++はついにそれをコア機能として追加しました。それは物事をより安全で信頼できるものにします。マクロが必要なものはまだありますが、それらはほとんどありません。

于 2012-09-13T22:52:00.950 に答える
2

はい、マクロに対してインライン関数を使用する必要があります。

パフォーマンスはマクロと同じになり(結局のところ、コードはインラインです)、型の安全性も得られます。

注意:これは、関数がコンパイラーがインライン化するのに十分単純であることを前提としています。gccの-Winlineオプションは、そうでない場合に警告します。プラットフォームで同じフラグがどのように機能するかわからない。

マクロを好む場合(たとえば、遅延評価)についても、この投稿を参照してください。ただし、質問に基づくと、インライン関数が明確な選択であるように思われます。

于 2012-09-13T22:44:49.767 に答える
0

私は間違っているかもしれませんが、コンパイラは同じソースファイルにある関数のみをインライン化できることを理解しています。インライン関数がファイルAにあり、それを他の場所で使用しようとしている場合、リンカーがリンク時の最適化を行わない限り、インライン関数をインライン化することはできません。

これは、コンパイラが一度に1つのCファイルのみを1つのオブジェクトファイルにコンパイルするためです。別のオブジェクトファイルからインライン関数を取得することはできません。これは、最初に、まだコンパイルされていない可能性があり、次に、どのオブジェクトファイルを検索するかがわからないためです。

于 2012-09-13T23:03:10.887 に答える