Сообщение Re[12]: Visual C# vs C++. Надо сравнить перспективы. от 09.01.2017 7:24
Изменено 09.01.2017 7:26 lpd
Re[12]: Visual C# vs C++. Надо сравнить перспективы.
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, lpd, Вы писали:
_>
_>Вот прямо в таком коде будет работать семантика перемещения (если конечно у big_object определены соответствующие методы). А теперь покажи свой более простой вариант, только чтобы он тоже был без копирования... )
Честно говоря, я не понял, какой в данном случае метод нужно объявить у big_object, чтобы он стал rvalue-ссылкой. Нужно вызвать move и вернуть big_object &&.
Но ты привел типичный случай, который решается элементарно:
big_object *obj=make_object(1024);
...
delete obj;
Я не понимаю, это что, из управляемых языков пошло, что "всех new и delete нужно исключить"? В случае с move-семантикой вызывающий код получает локальный объект на стеке, который обречен быть локальным. В случае с указателем, его можно отдать разным обработчикам.
lpd>>Давай конкретно: вот можешь описать случай с примером приложения и объекта, когда (бы) ты использовал move-семантику? хоть один?
_>Вообще то там миллион сценариев. Более того, частенько даже древний код можно существенно ускорить без переписывания, если подключить (перекомпилировать с опцией C++11 или старше) ему семантику перемещения. Но если ты хочешь, то я покажу самый банальный пример с явным вызовом:
_>
Такое всегда решалось динамическим созданием объекта и записью указателя в вектор. В твоем случае при реаллокации вектора все большие объекты будут копироваться. И опять же, на мой взгляд указатель удобнее для дальнейшей работы.
_>Здравствуйте, lpd, Вы писали:
_>
_>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 определены соответствующие методы). А теперь покажи свой более простой вариант, только чтобы он тоже был без копирования... )
Честно говоря, я не понял, какой в данном случае метод нужно объявить у big_object, чтобы он стал rvalue-ссылкой. Нужно вызвать move и вернуть big_object &&.
Но ты привел типичный случай, который решается элементарно:
big_object *make_object(int p)
{
if (p<0) return new big_object;
big_object *obj = new big_object(p);
prepare(obj);
return obj;
}
big_object *obj=make_object(1024);
...
delete obj;
Я не понимаю, это что, из управляемых языков пошло, что "всех new и delete нужно исключить"? В случае с move-семантикой вызывающий код получает локальный объект на стеке, который обречен быть локальным. В случае с указателем, его можно отдать разным обработчикам.
lpd>>Давай конкретно: вот можешь описать случай с примером приложения и объекта, когда (бы) ты использовал move-семантику? хоть один?
_>Вообще то там миллион сценариев. Более того, частенько даже древний код можно существенно ускорить без переписывания, если подключить (перекомпилировать с опцией C++11 или старше) ему семантику перемещения. Но если ты хочешь, то я покажу самый банальный пример с явным вызовом:
_>
_>vector<big_object> vec;
_>big_object obj;
_>prepare(obj);
_>vec.push_back(move(obj));
_>
Такое всегда решалось динамическим созданием объекта и записью указателя в вектор. В твоем случае при реаллокации вектора все большие объекты будут копироваться. И опять же, на мой взгляд указатель удобнее для дальнейшей работы.
Re[12]: Visual C# vs C++. Надо сравнить перспективы.
Здравствуйте, alex_public, Вы писали:
_>Здравствуйте, lpd, Вы писали:
_>
_>Вот прямо в таком коде будет работать семантика перемещения (если конечно у big_object определены соответствующие методы). А теперь покажи свой более простой вариант, только чтобы он тоже был без копирования... )
Честно говоря, я не понял, какой в данном случае метод нужно объявить у big_object, чтобы он стал rvalue-ссылкой. Нужно вызвать move и вернуть big_object &&.
Но ты привел типичный случай, который решается элементарно:
Я не понимаю, это что, из управляемых языков пошло, что "всех new и delete нужно исключить"? В случае с move-семантикой вызывающий код получает локальный объект на стеке, который обречен быть локальным. В случае с указателем, его можно отдать разным обработчикам.
lpd>>Давай конкретно: вот можешь описать случай с примером приложения и объекта, когда (бы) ты использовал move-семантику? хоть один?
_>Вообще то там миллион сценариев. Более того, частенько даже древний код можно существенно ускорить без переписывания, если подключить (перекомпилировать с опцией C++11 или старше) ему семантику перемещения. Но если ты хочешь, то я покажу самый банальный пример с явным вызовом:
_>
Такое всегда решалось динамическим созданием объекта и записью указателя в вектор. В твоем случае при реаллокации вектора все большие объекты будут копироваться. И опять же, на мой взгляд указатель удобнее для дальнейшей работы.
_>Здравствуйте, lpd, Вы писали:
_>
_>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 определены соответствующие методы). А теперь покажи свой более простой вариант, только чтобы он тоже был без копирования... )
Честно говоря, я не понял, какой в данном случае метод нужно объявить у big_object, чтобы он стал rvalue-ссылкой. Нужно вызвать move и вернуть big_object &&.
Но ты привел типичный случай, который решается элементарно:
big_object *make_object(int p)
{
if (p<0) return new big_object;
big_object *obj = new big_object(p);
prepare(obj);
return obj;
}
big_object *obj=make_object(1024);
...
delete obj;
Я не понимаю, это что, из управляемых языков пошло, что "всех new и delete нужно исключить"? В случае с move-семантикой вызывающий код получает локальный объект на стеке, который обречен быть локальным. В случае с указателем, его можно отдать разным обработчикам.
lpd>>Давай конкретно: вот можешь описать случай с примером приложения и объекта, когда (бы) ты использовал move-семантику? хоть один?
_>Вообще то там миллион сценариев. Более того, частенько даже древний код можно существенно ускорить без переписывания, если подключить (перекомпилировать с опцией C++11 или старше) ему семантику перемещения. Но если ты хочешь, то я покажу самый банальный пример с явным вызовом:
_>
_>vector<big_object> vec;
_>big_object obj;
_>prepare(obj);
_>vec.push_back(move(obj));
_>
Такое всегда решалось динамическим созданием объекта и записью указателя в вектор. В твоем случае при реаллокации вектора все большие объекты будут копироваться. И опять же, на мой взгляд указатель удобнее для дальнейшей работы.