Здравствуйте, lpd, Вы писали:
_>>Здравствуйте, lpd, Вы писали:
_>>Показываю конкретный и довольно известный случай. У тебя есть некий объект, который содержит некие тяжёлые ресурсы (большой объём памяти или ещё что-то) и автоматически управляет ими (в конструкторе/деструкторе). Так вот, расскажи как ты реализуешь создание и возврат (через return) данного объекта из функции без семантики перемещения? Чтобы и не надо было руками следить за временем жизни указателя и не было бы потери эффективности.
lpd>В большинстве случаев все действительно большие объекты — глобальные, а в функции передается индекс или указатель на элемент. Либо это какие-то вычисления, и там все равно нет никакой инкапсуляции между объектами, а есть массив intов, и просто передается указатель из одной функции в другую.
Вот не стоит обобщать свой опыт на всех. Тем более, что большое число глобальных переменных обычно свидетельствует о не самой лучшей архитектуре приложения (если мы говорим про C++).
lpd>В любом случае, язык программирования это не столько краткое представление операций, сколько простая их запись. По-моему, проще иногда передать указатель и следить за временем жизни(которое нужно учитывать в любом случае), чем пользоваться rvalue ссылками.
Проще? ) Ты похоже не понял главную идею этой техники. Идея как раз в том, что компилятор использует предоставленную дополнительную информацию (типа конструктора перемещения) для оптимизации самого обычного кода, в который при этом не надо добавлять вообще ничего. Т.е. вот простейший пример:
auto make_object(int p)
{
if(p<0) return big_object();
big_object obj(p);
prepare(obj);
return obj;
}
auto obj=make_object(1024);
Вот прямо в таком коде будет работать семантика перемещения (если конечно у big_object определены соответствующие методы). А теперь покажи свой более простой вариант, только чтобы он тоже был без копирования... )
lpd>Давай конкретно: вот можешь описать случай с примером приложения и объекта, когда (бы) ты использовал move-семантику? хоть один?
Вообще то там миллион сценариев. Более того, частенько даже древний код можно существенно ускорить без переписывания, если подключить (перекомпилировать с опцией C++11 или старше) ему семантику перемещения. Но если ты хочешь, то я покажу самый банальный пример с явным вызовом:
vector<big_object> vec;
big_object obj;
prepare(obj);
vec.push_back(move(obj));