возврат по значению в функциях c ++ - PullRequest
0 голосов
/ 12 января 2011

это правильный код в C ++?

list<int> makelist(int litem)
{
    list<int> newList;
    newList.push_front(litem);
    return newList;
}

Должны ли возникнуть проблемы с возвратом списка (из #include <list>) по значению?

Ответы [ 3 ]

1 голос
/ 12 января 2011

Как прокомментировано, возврат по значениям обычно будет оптимизирован (при работе с включенной оптимизацией).Так что, если скорость важна (чего не должно быть до тех пор, пока она не будет доказана профилировщиком), вам не стоит беспокоиться.С другой стороны, если список имеет некоторые странные побочные эффекты при копировании, вы должны знать, что количество вызовов конструктора копирования будет варьироваться в зависимости от компилятора и настроек.

1 голос
/ 12 января 2011

Это будет работать, но не эффективно, потому что много памяти может быть скопировано. В следующем стандарте C ++ эта проблема может быть решена. Я бы предложил следующий код:

void fillList(list & lst) {
   lst.push_front(...);
}
....
list newList;
fillList(newList);
0 голосов
/ 12 января 2011

Вы не можете вернуть локальный объект не просто типа (int, float, char), но вы можете вернуть указатель на новый объект:

list<int>* makelist(int litem)
{
    list<int>* newList = new list<int>();
    newList->push_front(litem);
    return newList;
}

позаботьтесь о том, чтобы выДОЛЖЕН управлять указателем последнего, чтобы избежать утечек памяти.

...