1

C プログラムが次のようないくつかの小さな関数で構成されている場合:

int isLetter(const char c){
    if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')){
        return 1;
    }
    return 0;
}

int isNumber(const char c){
    if(c >= '0' && c <= '9'){
        return 1;
    }
    return 0;
}

コードをインラインで実装する同様のプログラムよりも効率が悪いでしょうか?

4

3 に答える 3

5

これは、その答えが多くの状況変数に依存する質問です。関数がめったに呼び出されない場合、コンパイラは自動的にインライン化して、コードの局所性を高め、関数呼び出しのオーバーヘッドを取り除くことがあります。頻繁に呼び出される場合、関数のコードをインライン化すると、プログラムのサイズが大きくなり、キャッシュの効率が低下します。微妙なバランスを取る必要があり、一般的にコンパイラーが最も適切に見つけることができるものです。

そうは言っても、メモリ要件が厳しい組み込みシステムで作業している場合を除き、この問題について考えないでください。コードを読みやすく再利用できるようにすることに集中し、問題が見つかった場合にのみ元に戻って最適化してください。時期尚早の最適化は開発時間の無駄であり、不要なパフォーマンスの改善のために保守性を犠牲にするため、多くの場合、バグの導入につながる可能性があります。

于 2013-09-01T09:36:28.163 に答える
2

いいえ、効率が低下することはありません。それは同等に効率的であるか、より効率的です。コンパイラは小さな関数を自律的にインライン化し、そのヒューリスティックは非常に優れています。さらに、コンパイラのインライン化の決定が最適ではないことが判明した場合でも、パフォーマンスを向上させるためにマクロや手動のインライン化に切り替える必要はありません。事実上すべての主要なコンパイラには、関数のインライン化を強制または防止する方法があります。マクロや手動コードよりも関数の利点が得られます。

于 2013-09-01T09:39:38.093 に答える
0

関数を記述して宣言しinline、コンパイラに自動的にインライン化させることができます。

ctype.h使用している関数についても、私の記憶が正しければ、標準ライブラリに同等のものがあります。

于 2013-09-01T09:37:18.223 に答える