5

私はQtの初心者であり、いくつかのデータクラスを作成する必要があります。QSharedDataPointer例(ここ)のようにこれらすべてのクラスを作成するのは良いアプローチでしょうか、それともこれはオーバーヘッドが大きすぎるのでしょうか(作業量が多いという事実を除けば)?

私のクラスは、以下のクラスと非常によく似ていますEmployee。1万や数百万ではなく、数百のインスタンスを処理する必要があります。

QSharedData / QShareDataPointerを使用する動機は、手動のメモリ管理を簡素化し、共通のコードスタイルを使用することです。しかし、私がいくつかの警告を監督しているかどうかはまだわかりません。

から:

class EmployeeData : public QSharedData
 {
 public:
     EmployeeData();
     EmployeeData(const EmployeeData &other);
     ~EmployeeData();

     int id;
     QString *name;
 };

 class Employee
 {
 public:
     Employee();
     Employee(int id, const QString &name);

     void setId(int id) { d->id = id; }
     void setName(const QString &name);

     int id() const { return d->id; }
     QString name() const;

 private:
     QSharedDataPointer<EmployeeData> d;
 };
4

1 に答える 1

5

QSharedDataPointer/pImplイディオムを実行する利点は次のとおりです。

1)場合によってはデータのコピーを回避できます(たとえば、2つ以上の同一のEmployeeオブジェクトがある場合、それぞれが同じデータの独自のコピーを持つのではなく、同じEmployeeDataバックエンドを共有できます)

2)EmployeeDataクラスにデータフィールドを追加した後は、Employeeクラス(おそらく)のみがEmployeeDataクラスに直接アクセスするため、Employeeクラスのソースコードのみを再コンパイルする必要があります。他のすべてのコードは(おそらく)Employeeクラスにのみアクセスするため、Employeeクラスのサイズとレイアウトは変更されないため、再コンパイルする必要はありません。

これらの理由は両方とも、適切な状況では説得力があります。たとえば、Qt自体は、大量のデータを非常に効率的に処理する必要があるため、さらに重要なことに、Qtとサードパーティとの関係により、多くの場所でpImplと暗黙的な共有の恩恵を受けます。開発者は、新しいQt共有ライブラリバージョンが、古いQtバージョンに対してコンパイルされた既存のサードパーティアプリケーション実行可能コードとの下位互換性を維持することを保証する必要があります。

ただし、個人的なプログラムの場合、多くのメリットが得られる可能性はほとんどありません。データオブジェクトがEmployeeDataサンプルクラスに示されているものと同じくらい小さい/単純な場合(またはそれらが10倍または100倍大きい場合でも)、データのコピーを作成するだけのオーバーヘッドはおそらく最小限になります...そしておそらく必要なときにいつでも独自のコードベースを再コンパイルできるので、下位互換性の利点は実際には重要ではありません。

したがって、私のアドバイスは、シンプルに保ち、標準のC ++の方法で実行し、必要に応じてメンバーオブジェクトの通常の古いdefault-copy-constructorスタイルのコピーを作成することです(可能な場合はconst-referenceを介してオブジェクトをメソッドに渡し、最小化することです)それらがコピーされる回数)。測定可能なパフォーマンスの問題に気付いた場合は、その時点で、pImpl / QSharedDataPointerを使用してクラスの一部を書き直し、測定可能なスピードアップが得られるかどうかを確認できます(ただし、そうではない可能性があります)。

于 2012-07-16T05:12:23.987 に答える