J'ai quelques questions connexes pour chacune des questions ci-dessous J'espère que quelqu'un pourra répondre. Je sais que la plupart des gens ne se soucient pas des différences peut-être insignifiantes, mais je veux les comprendre pour l'exhaustivité.Quelques questions à propos de la boucle foreach et de la performance
1) Quelqu'un pourrait-il expliquer comment le mot-clé foreach dans Qt fonctionne réellement dans les coulisses. Je voudrais savoir si foreach crée un nouveau pointeur d'objet de l'article et réévalue les collidingItems (potentiellement coûteux) à chaque itération dans l'exemple ci-dessous
foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape) {
// do something with item;
}
et doit-il donc être saisi comme celui-ci
QGraphicsItem *item;
QList<QGraphicsItem *> itemList = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (item, itemList) {
// do something with item;
}
Je suppose un non, puisque selon la documentation il faut une copie de la liste avant d'entrer dans la boucle. Cependant, si je me souviens bien, au moins une déclaration for évalue la vérification à chaque itération, donc je veux juste être sûr.
2) Deuxième question. Depuis foreach fait une copie de la liste, est-il autorisé à changer l'original à l'intérieur du foreach comme dans
QList<QGraphicsItem *> itemList = someItem->collidingItems(Qt::IntersectsItemShape);
foreach (QGraphicsItem *item, itemList) {
if (item->type() != QGraphicsItem::UserType)
itemList.removeOne(item);
}
// continue using itemList
3) Une dernière question. Existe-t-il une différence de performance à précréer et réutiliser le pointeur (voir ci-dessous) ou à définir un nouveau pointeur à l'intérieur de la boucle foreach à chaque fois (supposons une grande liste)?
MyGraphicsItem *myItem; // a complex subclass of QGraphicsItem
foreach (QGraphicsItem *item, someItem->collidingItems(Qt::IntersectsItemShape)) {
myItem = qgraphicsitem_cast<MyGraphicsItem *>(myItem);
// do something with myItem;
}
Merci!