【发布时间】:2017-04-05 09:28:27
【问题描述】:
在 Qt 文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,还是仅仅m_data.clear(); 就足够了?
Qt 示例page.
【问题讨论】:
在 Qt 文档中有一个例子,他们使用
foreach (QVector<QPointF> row, m_data)
row.clear();
m_data.clear();
清除<QList<QVector<QPointF> > m_data;
是否有必要使用这样的结构,还是仅仅m_data.clear(); 就足够了?
Qt 示例page.
【问题讨论】:
它不仅没用,而且可能是“有害的”。
这是没用的,因为QList<T>::clear() 将销毁它拥有的每一个 T,有效地调用~T()。在您的情况下,这意味着您最终会为 QList 中的每个向量调用 ~QVector<QPointF>()。然后~QVector<QPointF>() 将为每个点调用~QPointF()。
这可能会损害性能,因为 QList 和 QVector 使用 Copy-on-Write。这意味着,当您复制列表时,您不会复制内部数据,但只要您执行将修改列表之一的操作,就会发生复制。
因此,如果m_data 与另一个 QList 共享其内部数据,则更改其任何元素(例如,通过在其中一个上调用 QVector::clear())将触发 QList 内部数据的硬拷贝。而且这个副本完全没用,因为您在调用m_data.clear() 之后将其丢弃。
另外值得注意的是:
foreach (QVector<QPointF> row, m_data)
row.clear();
不改变m_data。你清除 row 这是一个局部变量。即使你最终写了:
foreach (QVector<QPointF> &row, m_data)
row.clear();
引用Qt doc:
由于 foreach 使用非常量创建容器的副本 变量的引用不允许您修改原始 容器。它只影响副本,这可能不是你的 想要。
【讨论】: