Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/153.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 关于foreach循环和性能的几个问题_C++_Qt4 - Fatal编程技术网

C++ 关于foreach循环和性能的几个问题

C++ 关于foreach循环和性能的几个问题,c++,qt4,C++,Qt4,下面我有几个与foreach相关的问题,希望有人能回答。我知道大多数人并不关心可能微不足道的差异,但我想了解它们的完整性 (一) 有人能解释一下Qt中的foreach关键字在幕后是如何工作的吗。我想知道foreach是否创建了一个新的item对象指针,并在下面的示例中的每次迭代中重新计算冲突项(可能很昂贵) foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape) { // do

下面我有几个与foreach相关的问题,希望有人能回答。我知道大多数人并不关心可能微不足道的差异,但我想了解它们的完整性

(一) 有人能解释一下Qt中的foreach关键字在幕后是如何工作的吗。我想知道foreach是否创建了一个新的item对象指针,并在下面的示例中的每次迭代中重新计算冲突项(可能很昂贵)

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循环时,Qt自动获取容器的副本。如果在迭代时修改容器,则不会影响循环。(如果不修改容器,复制仍会进行,但由于隐式共享,复制容器的速度非常快。)

  • 它实际上复制了作为
    foreach
    的第二个参数传递的列表。在您的情况下,
    冲突项返回的列表将被复制到
    foreach
    中使用的变量中
  • 是的,这没问题(见下文)
  • 我认为不会有性能差异,因为指针是一种基本类型。如果它是一个类类型,那么如果在循环中声明它,每次迭代都必须调用它的构造函数
  • 从文档中:

    当容器进入foreach循环时,Qt自动获取容器的副本。如果在迭代时修改容器,则不会影响循环。(如果不修改容器,复制仍会进行,但由于隐式共享,复制容器的速度非常快。)


    乔布斯已经非常彻底地回答了这个问题。我只想补充一点,使用
    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;
    }