Информация об изменениях

Сообщение Re[12]: Visual C# vs C++. Надо сравнить перспективы. от 09.01.2017 7:24

Изменено 09.01.2017 8:39 lpd

Re[12]: Visual C# vs C++. Надо сравнить перспективы.
Здравствуйте, alex_public, Вы писали:

_>Здравствуйте, 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, Вы писали:


_>
_>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));
_>


Такое всегда решалось динамическим созданием объекта и записью указателя в вектор. В твоем случае при реаллокации вектора все большие объекты будут копироваться. И опять же, на мой взгляд указатель удобнее для дальнейшей работы(нескольких обращений к нему без копирования).