2011-01-12 3 views
0

Этот код верен в C++?Возвращаемое значение возврата в функции C++

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

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

+8

http://en.wikipedia.org/wiki/Return_value_optimization –

+0

Нет проблем с этим, проблема заключается в возвращении указателя или ссылки на локальный объект, который исчезнет. Это скопирует список или, по крайней мере, будет действовать так, как если бы он имел – jcoder

+1

. Как мы можем знать, правильно ли это, когда мы не знаем ваш тип 'list'? – sbi

ответ

1

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

1

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

void fillList(list & lst) { 
    lst.push_front(...); 
} 
.... 
list newList; 
fillList(newList); 
+0

Вы уверены, что это неэффективно? Насколько я понял, оптимизатор C++ заботится об этом и не копирует память! О, кажется, я прав, прочтите комментарий @ nice_blonde_stupid_girl выше. – Rafid

+4

Я бы посоветовал вам этого не делать, никакое профилирование не показало, что это узкое место. Вероятная оптимизация возвращаемого значения позаботится об этом, и даже если нет, такую ​​оптимизацию следует зарезервировать, когда они будут _needed_, вместо того, чтобы применяться досрочно. – sbi

-1

Вы не можете вернуть локальный объект, являются не просто тип (целый, дробный, символ), но вы можете вернуть указатель на новый объект:

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

заботиться, что вы должны во избежание утечек памяти.

+1

Это просто неправильно. Единственными типами, которые вы не можете вернуть на экземпляр, являются те, которые не позволяют копировать. – sbi

+0

Прошу прощения, но C++ не имеет проблем с возвратом какого-либо локального объекта по значению, если они так или иначе копируются. Нет указателей. Этот ответ просто ошибочен. – daramarak

Смежные вопросы