它並置的「隱含共享」 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