1

以下に示すような方法があります。forループは常にコンパイラを「インラインリクエスト」にしますか?

inline void getImsiGsmMapFrmImsi
  (
    const string& imsiForUEDir, 
    struct ImsiGsmMap& imsiGsmMap
  )
{
    for (int i = 0 ; (unsigned)i < imsiForUEDir.length() - 1 ; i++)
    {
         imsiGsmMap.value[i] = imsiForUEDir[i] - '0' ;
    }
    imsiGsmMap.length = imsiForUEDir.length() - 1 ;
}
4

6 に答える 6

5

「インライン」を指定すると、コンパイラはそのように感じた場合にそれを無視できます。

于 2009-10-23T06:00:45.363 に答える
3

単純に、いいえ。

" inline" はコンパイラへの単なるヒントです。

コンパイラに何かを強制する方法はありますinlineが、これらの方法はコンパイラ固有です。あなたのコードは私にはモバイルに見えるので、さまざまな携帯電話プラットフォームで使用されるいくつかの C++ コンパイラでのいくつかの方法を次に示します。

Windows CE/ Windows Mobile VC++ ARM コンパイラは__forceinline、ヒント ' inline ' の代わりにキーワードを使用します。

Windows CE/ Windows Mobile 用のより優れたコンパイラ (つまり、より高速な出力を行う)は、最新の GCC 4.4 を使用するcegccです。GCC では、関数名の__attribute__((always_inline)) 、本体の前に記述します。

より大きな問題は、このループをインライン化することをお勧めします。私は生計を立てるために携帯電話をプログラムしていますが、通常、携帯電話にはあまり CPU 予算がありません。しかし、このループがボトルネックであるとしたら、私は本当に驚くでしょう。プログラムからすべての「インライン」装飾を取り除き、出荷が近づいたときに、プログラムが遅い場合はプロファイルを作成してください。

一部のコンパイラは、現実的な方法で実行するインストルメント化されたバイナリを作成できる「プロファイルガイド付き最適化」を許可し、収集したデータを使用して本番バイナリを作成し、さまざまなコード速度とコードサイズについて情報に基づいた決定を行います。プログラムの一部を組み合わせて、両方の最適な組み合わせを提供します。

于 2009-10-23T05:55:13.003 に答える
2

「ループを含む関数のインライン化なし」は、おそらく特定のコンパイラからのインラインヒューリスティックです。それは普遍的に適用されません。

すべてのコンパイラは、いくつかのヒューリスティックを使用して関数をインライン化する必要があるかどうかを判断しますが、通常、すべてのコンパイラは独自のものを使用します。したがって、ループがインライン化に普遍的な影響を与えると言うのは正しくありません。それはしません。あなたの関数には、何らかの形でインライン化を根本的に排除するものはまったくありません。最近のほとんどのコンパイラは、合理的であると判断した場合、または強制的に実行させた場合、この関数を簡単にインライン化できます。

はい、一部のコンパイラは、実際にインライン化を強制する非標準の宣言指定子 (またはコンパイラ オプション) を提供します。つまり、インライン化がコンパイラの能力を本当に超えている多くの状況を除いて、ヒューリスティック分析をオーバーライドします。たとえば、最新の C/C++ コンパイラの多くは、通常、可変数のパラメーター (可変個の関数) を持つ関数をインライン化できません。

また、再帰関数はインライン化できないと一般に信じられていました。実際には、多くのコンパイラでは、再帰関数を特定の固定再帰深度にインライン化できるため、再帰を「圧縮」できます。

于 2009-10-23T06:07:48.453 に答える
0

これに対する以前の回答を要約すると、インライン化する関数を選択する際に注意すべき点は次のとおりです。

* local static variables
* loop constructs
* switch statements
* try/catch
* goto
* recursion
* and of course too much complexity (whatever that means)

ここでの他の回答が指摘しているように、コンパイラが関数をインライン化するかどうかは基本的に指定されていません。7.1.2/2 には:

インライン指定子を使用した関数宣言 (8.3.5、9.3、11.4) は、インライン関数を宣言します。インライン指定子は、呼び出し時点での関数本体のインライン置換が通常の関数呼び出しメカニズムよりも優先されることを実装に示します。呼び出し時にこのインライン置換を実行する実装は必要ありません。ただし、このインライン置換が省略された場合でも、7.1.2 で定義されたインライン関数の他の規則は引き続き尊重されます。

これに関する興味深い詳細は、コンパイラが通常、ここに含まれる動作の種類にラベルを付けるということです。例: 「それは未指定です」または「動作は未定義です」など。

于 2009-10-23T09:46:47.843 に答える
0

inline キーワードはもう必要なのだろうか。とにかく、現代のコンパイラはほとんどそれを無視して、彼らが最善だと思うことを何でもしますか?

于 2009-10-23T06:02:02.567 に答える
0

ほとんどの場合、コンパイラはループを使用して関数をインライン化しません。ポイントは何でしょうか? コードがループしている場合、通常、関数呼び出しのコストは、ループに比べて計り知れないノイズになります。

しかし、コンパイラがそれをインライン化したい場合 (おそらく、コンパイラはループの境界を決定するのに十分なほど洗練されており、ループをアンロールすることさえできます)、それは確かに許可されています。

しかし、私はそれに賭けません。

于 2009-10-23T06:14:41.513 に答える