它并置的“隐含共享” 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
)
而且我也想到他们这样做,这样,如果你改变你的矢量数据(或免费的话),这样会影响扶住由情节曲线的数据。如果您认为这些媒介是按照价值传递的(您无法判断您是否正在阅读调用网站),您不会期望这一点。
无论其看着似乎在引擎盖下,它只是做一个隐式共享副本反正源代码。在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引用(而不是只是值)是一个谜给我。在这里进行的唯一“共享”似乎是隐含的,所以我不知道“明确共享”评论应该是什么意思。
50毫秒通常是足够长的时间做了一大堆的东西。 – 2012-04-21 15:20:21