Re[11]: Visual C# vs C++. Надо сравнить перспективы.
От: alex_public  
Дата: 08.01.17 22:41
Оценка:
Здравствуйте, 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));
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.