2

1 つのクラスを複数のクラスに分割すると、プログラムの効率が低下するのではないかと考えています。私の質問を明確にするために、次の例を挙げます。

class OneClass
{
  public:
      Do_the_job()
      {
       Do_function1();
       Do_function2();
       Do_function3();
       }
      Do_function1();
      Do_function2();
      Do_function3();
      variables_related_to_function1;
      variables_related_to_function2;
      variables_related_to_function3;
}  

このクラスでは、機能を 3 つのサブ機能に分けることができ、それらは同じクラスに属します。ただし、メンテナンスを容易にするために、各サブ関数をクラスにすることにし、3 つの独立したクラスを 1 つのクラスに結合することで全体の機能を実行します。

Class OneClass
{
public:
   Do_the_job()
   {
     class1.do_function1();
     class2.do_function2();
     class3.do_function3();
   }
   Class1 class1;
   Class2 class2;
   Class3 class3;
}   

私の質問は、新しい実装によってプログラムの効率が低下するかということです。ありがとう。

4

4 に答える 4

4

おそらくそうではありませんし、たとえそうであっても、あなたが気付く可能性は低いです。

別のオブジェクトのメソッドを呼び出す最悪のケースは、ポインターを介して仮想メソッドを呼び出すことです。これには、実行するコードを見つけるために vtable ルックアップが必要であり、実行時に実行する必要があるため、インライン化の対象にはなりません。しかし、それでも非常に迅速であり、非常に特殊な状況を除いて、それに気付くことはありません.

値によって保持されるオブジェクトの通常のメンバー関数は、独自のメンバー関数を呼び出すのと同じくらい高速です。

実際に問題を引き起こしていることが確認できない限り、このようなことについて心配する必要はありません。作成している関数呼び出しの種類の影響は、欠陥のあるアルゴリズムによって引き起こされる潜在的な速度の問題、または一部の反復子クラスで後置インクリメントを不必要に使用することでさえ無視できます。

于 2013-06-18T10:53:08.297 に答える
0

複数のクラスがある場合でも、メソッドの呼び出しには、クラスが 1 つしかない場合と同じ時間がかかります。したがって、大きなクラスを分割して、読みやすさと保守性の向上から利益を得るべきではない理由はないと思います。

本当に重要なのは、実行時にメソッドのアドレスを検索する必要がある仮想メソッドの使用を開始する場合です (コンパイラがコンパイル時に解決/インライン化できない場合)。この場合、呼び出しは 1 つのマシン コード命令ではなく 3 つの順序で行われます。

動的ディスパッチと多重継承を使用している場合、1 つではなく 4 ~ 5 つのマシン コード命令のオーバーヘッドがあります。

とはいえ、同じクラスのオブジェクトが数千個ない限り、おそらく顕著な違いは感じられないでしょう。しかし、再びクラスの非仮想化を開始して、オーバーヘッドを削減できます。

于 2013-06-18T11:16:43.910 に答える