2

このページの内容:

http://qwt.sourceforge.net/class_qwt_plot_curve.html#afd13c94e23520dacbc37b4d0fd036a8b

方法

void QwtPlotCurve::setRawSamples()

データのアドレスをQwtPlotCurveに保存するだけです。これは、まさに私が効率のために望んでいることです。

その間:

void QwtPlotCurve::setSamples()

より便利なQVectorを使用します。しかし、それは「明示的に共有される」だけです。どういう意味ですか?最初のポインタと同じようにポインタを保存しますか?

50ミリ秒ごとにプロットにポイントを追加する必要があります。データのディープコピーは最善の解決策ではありません!!! 助言?

4

2 に答える 2

7

これは、Qtの「暗黙の共有」の概念と並置されています。

http://doc.qt.io/archives/qt-4.7/implicit-sharing.html

データのQVectorをQtのパラメーターとして値で渡しても、メモリはすぐにはコピーされません。ベクトルの1つが変更された場合にのみ、コピーが作成されます。

setSamplesの場合の「明示な共有」というドキュメントは、値ではなく参照によってQVectorを渡しているという事実に注意を引くためだけのものだと思います。

void QwtPlotCurve::setSamples(
    const QVector< double > &xData,
    const QVector< double > &yData 
)

また、ベクトル内のデータを変更(または解放)すると、プロット曲線によって保持されるデータに影響を与えるように、これを行ったと思います。ベクトルが値で渡されたと思った場合、それは期待できません(コールサイトを読んでいるだけかどうかはわかりません)。

ただし、ソースコードを見ると、内部では、とにかく暗黙的に共有されたコピーを作成しているように見えます。qwt_plot_curve.cppには、次のものがあります。

/*!
   \brief Initialize data with x- and y-arrays (explicitly shared)

   \param xData x data
   \param yData y data
   \sa QwtPointArrayData
*/
void QwtPlotCurve::setSamples( const QVector<double> &xData,
    const QVector<double> &yData )
{
    setData( new QwtPointArrayData( xData, yData ) );
}

QwtPointArrayDataがqwt_point_data.hで次のように宣言されていることがわかります。

class QWT_EXPORT QwtPointArrayData: public QwtSeriesData<QPointF>
{
public:
    QwtPointArrayData( const QVector<double> &x, const QVector<double> &y );
    QwtPointArrayData( const double *x, const double *y, size_t size );

    virtual QRectF boundingRect() const;

    virtual size_t size() const;
    virtual QPointF sample( size_t i ) const;
    const QVector<double> &xData() const;
    const QVector<double> &yData() const;

private:
    QVector<double> d_x;
    QVector<double> d_y;
};

qwt_point_data.cppのコンストラクターのコードは、d_xとへの単純な割り当てd_yです。これは、単純な古い暗黙の共有に戻ります。したがって、渡したデータに加えた変更は、プロットには表示されません。そのような変更時に作成されたコピーの料金を支払う必要があります。

彼らがこれをやろうとしていたのなら、なぜ彼らが(値だけでなく)const参照を渡すのをわざわざしたのかは私には謎です。ここで行われている唯一の「共有」は暗黙的であるように思われるので、「明示的に共有された」コメントが何を意味するのかわかりません。

于 2012-04-21T15:12:48.117 に答える
3

http://doc.qt.io/archives/qq/qq02-data-sharing-with-class.htmlから直接取得

明示的な共有では、オブジェクトを変更する前にdetach()を呼び出すのは、クラスではなくユーザーの責任です。ユーザーがdetach()を呼び出すのを忘れた場合、同じデータを共有するすべてのオブジェクトの状態が変更され、非常に危険な副作用が発生します。

明示的に共有されるクラスは、意味的にはポインターに似ています。int *を使用する左側のコードと、架空の明示的に共有されたIntクラスを使用する右側のコードを比較してください。

int *a = new int( 111 );    Int a( 111 );
int *b = a;                 Int b = a;
*b = 222;                   b = 222;
qDebug( "%d", *a );         qDebug( "%d", (int) a );

どちらのプログラムも222を出力します。左側のコードの場合、これは予想どおりです(ポインター構文は大きなヒントです)が、右側のコードの場合、これは不快な驚きです。明示的な共有は所有権の問題を解決する可能性がありますが、その誤解を招く構文は、ポインターの代わりとしてそれを信用しません。

QtクラスのQMemArray、QImage、およびQMovieは、履歴を明示的に共有しているためです。頭を水上に保つには、明示的に共有されているクラスを扱うときに、次のガイドラインのいずれかを選択してください。

明示的に共有されるクラスは避けてください。オブジェクトにコピーがないことが確実でない限り、オブジェクトを変更しようとするたびにdetach()を呼び出します。これは非常にエラーが発生しやすいです。オブジェクトのコピーを作成するたびにdetach()を呼び出します。b= a; b.detach(); これにより、共有が事実上無効になり、それ以外の場合はdetach()を呼び出す必要がなくなります。使用可能な場合は、copy()関数を使用します。

b = a.copy();
于 2012-04-21T15:08:28.707 に答える