0

次のコードをインライン関数に配置するのは合理的ですか、またはインライン化するには大きすぎます:

getPriority(const Data& data)
{
    Priority plidPriority = PRIORITY_STANDARD;

    if (data.isIPaddr)
    {
        Priority = PRIORITY_HIGHEST;
    }
    else if (data.plid == PROTO_HTTP || data.plid == PROTO_SIP || data.plid == PROTO_RTCP)
    {
        Priority = PRIORITY_PLID;
    }
    else if (data.port && data.port < 1024)
    {
        Priority = PRIORITY_ELEVATED;
    }

    return Priority;
}
4

4 に答える 4

1
  1. 自動的にインライン化するには、関数をどのくらい短くする必要がありますか? そのための行制限はありますか?

厳密な制限はありません (より正確には、特定のシステムで上限を見つけることはできますが、どこにも指定されていません)。コンパイラは、特定の状況下でこのプロセスの利点を予測しようとします。関数をインライン化するとコードが遅くなったり、容認できないほど大きくなるとコンパイラが判断した場合、コンパイラはインライン化しません。または、コールバックに関数ポインターを使用する他のコードや、動的/静的コード ライブラリのように関数を外部にエクスポートするなど、構文上の依存関係のために単純にできない場合。また、マーキング機能は希望を表現しているだけであることも覚えておいinlineてください。コンパイラはこれを行う義務はありません。C では、内部リンケージを持つすべての関数をインライン化できますが、外部リンケージを持つ関数には制限があります。

2. Is there any way to know that a function is automatically in-lined ?

バイナリを逆アセンブルすると、関数への呼び出しがあるかどうか、またはインラインにあるかどうかがわかります。

インライン関数はパフォーマンスを向上させますか?

インライン関数

于 2013-09-30T16:18:45.433 に答える
0

インライン化の主な懸念事項は、コードの肥大化です。したがって、関数が 1 つまたはいくつかの場所でのみ呼び出される場合 (関数が何度も呼び出されるため、オーバーヘッドが非常に大きくなる場合)、より大きなコードもインライン化できます (コンパイラがインライン化する場合)。インライン化します。コード内の多くの場所で関数を呼び出している場合、問題になる可能性があります。

したがって、ここに示されていないコードからこの関数がどのように呼び出されるかによって異なります。

また、インライン化するかどうかはコンパイラに依存します。インライン化が非常に必要であり (ベンチマーク後にのみ評価できます)、コードが大きいと思われる場合は、関連するコンパイラ オプションを指定して制限を増やすことができます。

于 2013-09-30T16:02:01.427 に答える