C++ 关于foreach循环和性能的几个问题
下面我有几个与foreach相关的问题,希望有人能回答。我知道大多数人并不关心可能微不足道的差异,但我想了解它们的完整性 (一) 有人能解释一下Qt中的foreach关键字在幕后是如何工作的吗。我想知道foreach是否创建了一个新的item对象指针,并在下面的示例中的每次迭代中重新计算冲突项(可能很昂贵)C++ 关于foreach循环和性能的几个问题,c++,qt4,C++,Qt4,下面我有几个与foreach相关的问题,希望有人能回答。我知道大多数人并不关心可能微不足道的差异,但我想了解它们的完整性 (一) 有人能解释一下Qt中的foreach关键字在幕后是如何工作的吗。我想知道foreach是否创建了一个新的item对象指针,并在下面的示例中的每次迭代中重新计算冲突项(可能很昂贵) foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape) { // do
foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape) {
// do something with item;
}
那么它应该这样打字吗
QGraphicsItem *item;
QList<QGraphicsItem *> itemList = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (item, itemList) {
// do something with item;
}
QGraphicsItem*项目;
QList itemList=someItem->collingitems(Qt::IntersectsItemShape);
foreach(项目,项目列表){
//对物品做点什么;
}
我假设是否定的,因为根据文档,它在进入循环之前需要一份列表的副本。但是,如果我没有记错的话,至少会有一个for语句在每次迭代中对检查进行求值,所以我只想确定一下
(二)
第二个问题。因为foreach复制了列表,所以可以在foreach中更改原始列表吗
QList<QGraphicsItem *> itemList = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (QGraphicsItem *item, itemList) {
if (item->type() != QGraphicsItem::UserType)
itemList.removeOne(item);
}
// continue using itemList
QList itemList=someItem->collingitems(Qt::IntersectsItemShape);
foreach(QGraphicsItem*项目,项目列表){
if(item->type()!=QGraphicsItem::UserType)
项目列表。移除一个(项目);
}
//继续使用itemList
(三)
最后一个问题。每次预创建和重用指针(如下所示)或在foreach循环中定义新指针(假设有一个大列表)时,性能vise是否有任何差异
MyGraphicsItem*myItem;//QGraphicsItem的一个复杂子类
foreach(QGraphicsItem*item,someItem->collingitems(Qt::IntersectsItemShape)){
myItem=qgraphicsitem_cast(myItem);
//用myItem做点什么;
}
谢谢大家!
foreach
的第二个参数传递的列表。在您的情况下,冲突项返回的列表将被复制到foreach
中使用的变量中
foreach
的第二个参数传递的列表。在您的情况下,冲突项返回的列表将被复制到foreach
中使用的变量中
乔布斯已经非常彻底地回答了这个问题。我只想补充一点,使用
foreach
而不是正常的for
循环的性能差异可能非常小,您永远无法测量它。换句话说,这不是您应该关心的性能问题
使用探查器测量代码中的瓶颈,并将重点放在优化实际速度较慢的部分上 乔布斯已经非常彻底地回答了这个问题。我只想补充一点,使用
foreach
而不是正常的for
循环的性能差异可能非常小,您永远无法测量它。换句话说,这不是您应该关心的性能问题
使用探查器测量代码中的瓶颈,并将重点放在优化实际速度较慢的部分上
MyGraphicsItem *myItem; // a complex subclass of QGraphicsItem
foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape)) {
myItem = qgraphicsitem_cast<MyGraphicsItem *>(myItem);
// do something with myItem;
}