2

関数をコード内の小さなサブ関数に分割すると、プログラムの効率に影響を与える可能性がありますか? 関数の循環的な複雑さを減らしながら、関数を小さな部分に分解し、ヘルパー関数とインライン関数を使用しました。

void functionParent(arguments)
{

    intialCheckFunction(arguments);
    functionOne();
    functionTwo();
    functionThree();
    functionFour();

    return STATUS;
}

void functionOne()
{
   /*follows unary Principle.*/
}

私の懸念は、スタック ポインターに関するものです。SP を頻繁に切り替えると、プログラムの効率が大幅に低下するか、または無視できるほど低下します。上記の functionOne、Two、.. には UNARY Logic が含まれています。C と C++ の両方のコンテキストで親切enter code hereに返信してください

4

3 に答える 3

3

読みやすくなると思われる場合はいつでも、ロジックを独自の関数に分割する必要があります。関数呼び出し自体のコストはごくわずかです。

一般に、関数を呼び出すといくらかのスペースと CPU サイクルが消費されることは事実ですが、まったく心配する必要はありません。関連する命令は信じられないほど最適化されており、コンパイラは適切と判断したときにコードをインライン化できます。

編集( Potatoswatter のコメントに応えて)

注意が必要なことの 1 つは、パラメーターを渡すことです。特に C++ では、関数に渡されるパラメーターをコピーするプロセスにユーザー コードが関与する可能性があります。大きなstructs を値で渡すと、C でも数サイクル以上かかることがあるため、できる限り参照またはポインターで渡す必要があります。

于 2012-06-28T10:55:45.847 に答える
0

通常、関数を小さな関数に分割して、他の場所で再利用できるようにすることを好みます。リファクタリング中に必要になることがよくあります。スイッチが非常に心配で、関数が非常に小さい場合は、インラインとしてマークできます。ただし、関数が多すぎると、プログラムのパフォーマンスに大きな違いが生じるとは思いません。

于 2012-06-28T10:55:08.530 に答える
0

C++ を使用している場合は、インライン関数を宣言できます。コードがインラインで置き換えられると、関数呼び出しによるオーバーヘッドは発生しません。

inline bool check(args){
    if( some_condiction(args) ){
        return true;
    }
}
inline void functionOne(){...}
inline void functionTwo(){...}
inline void functionThree(){...}
inline void functionFour(){...}

int functionParent(arguments){

    if(check(arguments)==false)
         return FAIL;

    functionOne();
    functionTwo();
    functionThree();
    functionFour();

    return STATUS;
}

現在のプロセッサ アーキテクチャは、一度に複数の命令を実行します (5 としましょう)。特定の瞬間に、90%、80%、70%、60%、50% と言って、完了の中間段階にある可能性があります。最初の命令が関数呼び出しの場合、次の 4 つの命令を評価するためのすべての努力が無駄になり、プログラムの実行速度が大幅に低下します。

重要なアプリケーションを作成する場合を除き、これらの詳細についてあまり気にする必要はありません。通常、コンパイラは、最適化フラグを使用するときに必要な関数をインライン化するのに十分スマートです。

于 2012-06-28T12:13:02.813 に答える