Здравствуйте, aloneguid, Вы писали:
A>Здраствуйте,
A>Объясните плиз происходит ли при return создание нового вектора и копирование, и почему?
A>
A>vector<char> function1(...)
A>{
A> vector<char> v;
A> ...
A> return v;
A>}
A>
A>Спасибо!
Происходит от 0 до 1 созданий нового вектора и копирований.
В таком коде:
vector<char> v = function1();
Происходит от 0 до 2 созданий нового вектора и копирований.
В таком коде:
vector<char> const& v = function1();
Происходит от 0 до 1 созданий нового вектора и копирований.
Сколько конкретно — зависит от компилятора, настроек компилятора и реализации объекта. На количество созданий/копирований полагаться нельзя. Тут компилятор в праве подавлять даже вызовы функций, определённые пользователем и с побочными эффектами.
Здравствуйте, remark, Вы писали:
A>>Объясните плиз происходит ли при return создание нового вектора и копирование, и почему?
R>Происходит от 0 до 1 созданий нового вектора и копирований.
А можно с пояснениями? Желательно всех примеров...
Здравствуйте, aloneguid, Вы писали:
A>Здраствуйте,
A>Объясните плиз происходит ли при return создание нового вектора и копирование, и почему?
A>
A>vector<char> function1(...)
A>{
A> vector<char> v;
A> ...
A> return v;
A>}
A>
A>Спасибо!
Передача по значению может производить копирование.
Re[4]: return value
От:
Аноним
Дата:
01.10.07 06:20
Оценка:
Здравствуйте, remark, Вы писали:
R> R>Это идентично. Я думаю, твой компилятор должен был выдать варнинг R>
Недавно вроде обсуждали, что const T& имеет право продлить время жизни объекта, T& — нет
Здравствуйте, <Аноним>, Вы писали:
R>> R>>Это идентично. Я думаю, твой компилятор должен был выдать варнинг R>> А>Недавно вроде обсуждали, что const T& имеет право продлить время жизни объекта, T& — нет
С другой стороны,
1) const T& == T const& == const T const& == T const const const const&
2) T& ref = return_T_value() — является апокрифом. На VC оно не просто имеет, а обязано продлевать время жизни объекта (равно как T const&), а на остальных — получишь ошибку компиляции.
Здравствуйте, AKh, Вы писали:
AKh>Передача по значению может производить копирование.
К-сть — с-а т.!
В данном случае — с наибольшей вероятностью будет произведено копирование.
Потому что
1) NRVO — редкость
2) у вектора нет move constructor (эх, дождёмся ли?)
3) а через регистры его передавать нельзя (во-первых, большой объект, а во-вторых, конструкторы/деструктор нетривиальные)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, AKh, Вы писали:
AKh>>Передача по значению может производить копирование.
К>К-сть — с-а т.!
К>В данном случае — с наибольшей вероятностью будет произведено копирование. К>Потому что К>1) NRVO — редкость К>2) у вектора нет move constructor (эх, дождёмся ли?) К>3) а через регистры его передавать нельзя (во-первых, большой объект, а во-вторых, конструкторы/деструктор нетривиальные)
std::vector<char> function1()
{
std::vector<char> v;
v.push_back(0);
return v;
}
int main()
{
std::vector<char> v = function1();
v.push_back(0);
}
Это ты показал, во что развернулся main(). Кто бы сомневался, здесь RVO сделано.
А теперь посмотри, во что превратилась function1.
Кстати, интересно, что при /Ox — NRVO выполнилось. А причина этому — тривиальная реализация конструктора без параметров! (Попросту, забили структуру нулями). Круто!
Вот если бы конструктор был затейливым — то могли и обломиться...