0

キューのように QVector を使用したい。これは、ベクター内のデータへの生のポインターにアクセスしたいのに、QVector がデータを連続して配置するためです。したがって、スレッド内の QVector にデータを追加し、別のスレッドで最初の要素からカウント要素を読み取り、それらを削除します。

QVector の途中から削除すると、データが再配置され、多くのコピーが行われます。QVector の先頭から count 要素を削除するときにデータがコピーされるのか、それともオーバーヘッドがほとんどないのかを知りたいですか? これを行うためのより良い方法はありますか?

4

2 に答える 2

3

このクラスを使用してQVector::removeパフォーマンスをチェックできます。

#include <QDebug>

class Dummy
{
public:
    Dummy()
    {
        qDebug() << "dummy ctor" << ++c1;
    }

    Dummy(const Dummy &d)
    {
        qDebug() << "dummy copy ctor" << ++c2;
    }

    Dummy &operator=(const Dummy &d)
    {
        qDebug() << "dummy asign" << ++c3;
    }

    static int c1, c2, c3;
};

int Dummy::c1 = 0;
int Dummy::c2 = 0;
int Dummy::c3 = 0;

テスト自体:

int main(int argc, char *argv[])
{
    QVector<Dummy> v;

    for (int i = 0; i < 100; ++i)
    {
        v.append(Dummy());
    }

    qDebug() << "adding finished";

    v.remove(0);
    v.remove(v.size() - 1);

    qDebug() << "end";

        return 0;
}

この例Dummyでは、最初の要素を削除するときに assign 演算子が 99 回呼び出され、最後の要素を削除するとまったく呼び出されません。

とにかく、コンテナの生データにアクセスする必要がある場合は、設計上の問題があると思います。JKSH がコメントで述べたように、データ要素にメモリを動的に割り当ててから、それらのポインターをコンテナーに入れることができます。

于 2014-03-19T10:21:53.650 に答える
1

問題は、データが連続して格納されているデータ構造を探していると同時に、データを再配置する必要があることです (つまり、先頭から要素を削除します)。ベクトル内のすべての要素を削除しない限り、この操作では、ベクトルを連続した状態に保つために常にデータを移動する必要があります。

デザインのパフォーマンスを最適化するために私が提案できるアプローチの 1 つ (ベクトルの代わりにリストを使用し、ポインターによるアクセスをあきらめる以外) は、最初の要素を削除するとfrontポインターが単純にインクリメントされ、再配置されないカスタム ベクトルを作成することです。データ。これは、最初の要素を削除するのと同じ効果がありますが、パフォーマンスが低下することはありません。また、削除された要素が特定のしきい値に達するとベクトルを圧縮するクリーンアップ ルーチンを実装する必要がありますが、このクリーンアップをキューから削除するたびに実行するのではなく、いつ実行するかを制御できます。

于 2014-03-19T12:08:53.937 に答える