1

クラスにメンバー関数を追加し続けると、パフォーマンスが大幅に低下しますか? クラスを使用する場合、一度にいくつかのメンバー関数しか使用できないため、理論的には、単一のクラスをメンバー関数の少ない多数の小さなクラスに分割できます。多くの関数を同じクラスに詰め込むと、パフォーマンスが大幅に低下しますか?

4

3 に答える 3

4

いいえ、関係ありません。
しかし、多くの公開 API が存在するということは、優れた設計をしようとしている場合は 、単一責任の原則に従っていることを確認する必要があることを示しています。

クラスを変更する理由は 1 つだけであってはなりません。

設計がそれに準拠している場合、そのすべてが適切であり、多くの機能をクラスに詰め込んでも、パフォーマンスの点で悪いことにはなりません。

一部の人々は、これらの関数のパフォーマンス ヒットについて議論するかもしれませんが、それらvirtualの関数の目的が派生クラスでオーバーライドされるvirtual限り、それらの関数を作成する必要がvirtualあります。よく考えられた設計に基づいて、先に進んでそれらを作成してくださいvirtual。パフォーマンスへの影響は、必要な機能に対して支払う代償であるため、心配する必要はありません。

また、プロファイリングのみが実際にパフォーマンスのボトルネックを正確に示すことができます。得られるのは経験に基づく憶測または推測であり、常に真の指標とはならない場合があります。

于 2012-05-20T07:52:45.300 に答える
2

パフォーマンスへの影響は、多くの関数があることではなく、特定のタスクを実行するための関数呼び出しの深い階層があることによるものです。すべての関数呼び出しは結果として

  1. 現在のベースポインタを押す/保存する
  2. 現在のスタックポインタを保存してから、現在のスタックポインタを新しいベースポインタとして作成します。
  3. スタック上のパラメーターをプッシュします。

  4. 関数を実行します。

たとえば、実行のシーケンスで10関数を呼び出すことになった場合、スタックを10回巻き上げ、関数(/ s)が終了したら、スタックを巻き戻す必要があります。

次に、関数へのジャンプのコストを削減するためのgcc最適化があります。たとえば、関数の局所性を改善する呼び出しを.Text使用して、関数へのアクセスを高速化します。attributehot

さまざまなボトルネックを識別して最適化できるように、関数の実行を*それを実行するスレッドのコンテキストで*と考える必要があります。

于 2012-05-20T07:58:12.417 に答える
1

クラスをより小さな断片に分割しても、バイナリ サイズに違いはありません。呼び出す関数のみにバイナリ サイズを縮小したい場合は、クラスをテンプレートにすることができます。

于 2012-05-20T07:49:54.540 に答える