2012-04-26 11 views
6
void run_hot(void) { 
    // I am called very often! 
    serve(); 
    // <more code here> 
} 

void run_cold(void) { 
    // I am called only occasionally! 
    serve(); 
    // <more code here> 
} 

???inline??? void serve(void) { 
    // I only want to be called inline from hot functions! 
    // <more code here> 
} 

明示的ないC機能で同じ関数Aをインライン化ながら、明示的に機能機能Bでをインライン化する方法はありますか?それとも、私のコンパイラが完全に慈悲であるのですか?関数を部分的または選択的にインライン化することはできますか?

+0

別のコンパイル単位に関数を挿入することで、インライン展開を禁止することができます。 –

+0

@JensGustedt例を挙げることができますか?私はあなたが何を考えているかを推測するのにいくつかの困難を抱えています。 – Will

+0

関数がインライン化されないようにするには、定義を別の.cファイルに入れて別々にコンパイルします。 –

答えて

4

あなたはインラインでコンパイラを完全に使いこなしています。
inlineに関数があるかどうかは、コンパイラが最適な決定であるかどうかにかかわらず、部分的に置き去りにしておいてください。

+0

>関数をインライン化するかどうかは、コンパイラが最もよく行う決定のみです。 実際、これは通常の知恵であると思われますが、通常は最もスマートな方法ですが、どの機能が「ホット」であるかを判断するために、コンパイラはプログラムが扱うデータの種類を知る必要があります。もちろん、外部IOからデータが到着するかどうかはわかりません。だから私のように、人間のプログラマーがもっとよく知っている場合があります... – Will

+3

@Will GCCを使っているなら、その関数をもっと最適化するようにコンパイラに伝えるために '__attribute __((hot))'を使うことができますそれは推測する必要はありません。 – ughoavgfhw

+0

@ughoavgfhw優秀!ありがとう! – Will