明确分享的意思是什么?

The*_*ist 2 c++ qt pointers class qwt

在此页面中:

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

方法

void QwtPlotCurve::setRawSamples()
Run Code Online (Sandbox Code Playgroud)

只需保存QwtPlotCurve中的数据地址,这正是我想要的效率.

而:

void QwtPlotCurve::setSamples()
Run Code Online (Sandbox Code Playgroud)

使用QVector,更方便.但它只是"明确分享".那是什么意思?像第一个一样保存指针吗?

我需要每50毫秒添加一个点.深度复制数据不是最好的解决方案!建议?

Hos*_*ork 7

它与Qt的"隐性共享"概念并列:

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

即使您通过值传递QVector数据作为Qt中的参数,它也不会立即复制内存.如果其中一个向量发生变化,它只会复制.

本以为在setSamples案例中说"显式共享"的文档只是为了引起人们注意你通过引用而不是通过值传递QVectors这一事实:

void QwtPlotCurve::setSamples(
    const QVector< double > &xData,
    const QVector< double > &yData 
)
Run Code Online (Sandbox Code Playgroud)

而且我也会认为他们这样做是为了如果你改变矢量中的数据(或释放它),它将影响绘图曲线所保持的数据.如果您认为向量是按值传递的(您无法判断您是否只是在阅读调用点),那么您并不期望这样做.

然而,看看源代码,看起来无论如何它只是制作一个隐式共享的副本.在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 ) );
}
Run Code Online (Sandbox Code Playgroud)

我们可以看到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;
};
Run Code Online (Sandbox Code Playgroud)

qwt_point_data.cpp中构造函数的代码只是对d_xand 的简单赋值d_y.这可以追溯到普通的"隐性共享".因此,您在传入的数据中所做的更改将不会被图表看到; 您将支付在此类修改时制作的副本.

如果他们只是要这样做,那么为什么他们打扰传递const引用(而不仅仅是值)对我来说是一个谜.这里唯一的"共享"似乎是隐含的,所以我不知道"明确共享"的评论是什么意思.