Разве строка QProcess *p не избыточна?

Я наткнулся на этот проект GitHub.

Хотя я не согласен с кодом в целом, я не могу понять строку:

QProcess *p; и p=*it;

Я ошибаюсь, когда мне кажется, что создание нового указателя совершенно избыточно, или есть какая-то цель, которую я упускаю, например, с точки зрения производительности?

#define VM_COUNT 202
    cout << "Creating process objects" << endl;
    for(int i=0;i<VM_COUNT; i++)
        vms.push_back(new QProcess(parent));

    cout << "Processes created. Type 'asdf' or someting to start them...";
    string s;
    cin >> s;

    cout << "Starting processes" << endl;

    QProcess* p; // this <------
    QVector<QProcess*>::Iterator it;
    for(it=vms.begin(); it!=vms.end(); ++it){
        p=*it; // this <------
        p->start(command,args); // this <------
    }

Я бы просто пошел с:

     for(it=vms.begin(); it!=vms.end(); ++it)
     {
        (*it)->start(command,args); // ty Mike
     }

person deW1    schedule 07.03.2015    source источник
comment
Да, это кажется бесполезным, если они не используют последний элемент после цикла. Я бы пошел с for (auto p : vms) p->start(command, args)   -  person tux3    schedule 07.03.2015
comment
Если vms — это что-то вроде вектора, то изменение выглядит нормально. Если xms — это список, то использование [] может быть намного медленнее.   -  person brian beuning    schedule 07.03.2015
comment
@brianbeuning в прошлый раз, когда я проверял, я думаю, что вы вообще не можете получить доступ к QList через []. Но да, в данном случае это QVector.   -  person deW1    schedule 07.03.2015
comment
Это будет (*it)->, а не vms[it]->, но да, в этом конкретном цикле нет особой необходимости в дополнительной переменной. Может быть, автор любит указатели.   -  person Mike Seymour    schedule 07.03.2015
comment
С точки зрения производительности наличие или отсутствие явного p, скорее всего, не имеет значения. Компилятор должен сгенерировать код, который извлекает указатель и где-то его сохраняет. Что будет, скорее всего, в реестре. Таким образом, будет p независимо от того, заботитесь вы об этом или нет. Это просто пустая трата времени, чтобы написать это явно. Возможно, автор не знал, как написать (*it)->start(...);...   -  person Kuba hasn't forgotten Monica    schedule 08.03.2015


Ответы (1)


Это полезно для переносимости кода или при сопоставлении с примером. Скажем, вы нашли пример, который использует QProcess * p для 100 строк, а затем вы применяете его к вектору процессов, удобочитаемость страдает, когда вы заменяете p на (*iter) в каждом месте... но если вы назначаете переменную с тем же именем в В верхней части локальной области вы получаете удобочитаемость/обслуживаемость.

Также Qt поддерживает множество типов итераторов, стиль STL, стиль Java и стиль boost foreach. Я предпочитаю стиль foreach, который обеспечивает наименьшее количество кода и максимальную читабельность для меня. И, кажется, это то, что документация и примеры, которые есть в Qt, тоже предпочитают.

Обязательно прочтите о mutable v immutable, когда будете искать, какие итераторы использовать.

QList<QProcess *> listOfProcesses;

// ...

foreach(Process * p, listOfProcesses)
{
    p->start();
}

И кстати, я мог бы написать это один раз с p, но перед тем, как закоммитить или оставить код, я бы сделал Ctrl+Shift+R в Qt Creator и переименовал p в process.

Надеюсь, это поможет.

person phyatt    schedule 07.03.2015
comment
кажется законным, однако foreach, насколько я знаю, не очень эффективен с точки зрения производительности. В общем, я бы просто использовал комментарий, чтобы уточнить, что такое (*iter), чем потерять производительность. - person deW1; 07.03.2015
comment
stackoverflow.com/questions/10522155/ doc.qt.io/qt-5/containers.html#the-foreach-keyword Похоже, что это эквивалентно итератору stl, и это макрос, поэтому он заменяется перед компиляцией. Потеря производительности - спорный вопрос. - person phyatt; 10.03.2015