它与 Qt 的“隐式共享”概念并列:
http://doc.qt.io/archives/qt-4.7/implicit-sharing.html
即使你在 Qt 中按值传递一个 QVector 的数据作为参数,它也不会立即复制内存。如果其中一个向量发生更改,它只会制作副本。
我原以为在 setSamples 案例中说“显式共享”的文档只是为了提请注意您通过引用而不是值传递 QVectors 的事实:
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
and的简单赋值d_y
。这可以追溯到普通的 ol' 隐式共享。因此,您对传入的数据所做的更改将不会被绘图看到;您将支付进行此类修改时制作的副本的费用。
如果他们只是要这样做,那么为什么他们费心传递一个 const 引用(而不仅仅是通过值)对我来说是一个谜。这里唯一的“分享”似乎是隐含的,所以我不知道“明确分享”的评论应该是什么意思。