powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
25 сообщений из 26, страница 1 из 2
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070552
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
RVO ведь по сути и быстрее и проще.
Не надо тратить время на описание конструктора перемещения и машине не надо его исполнять.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070570
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move Construc,

Это вообще то разные вещи.
Rvo не имеет семантики в языке. Что с, что без, программа будет работать одинаково логически, но может быть быстрее немного в одном случае.

Move это реально другая семантика поведения программы.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070574
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может это связанно с введением rvalue references?
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070594
MasterZivвместо RVO сделали Move Construc,

Это вообще то разные вещи.
Rvo не имеет семантики в языке. Что с, что без, программа будет работать одинаково логически, но может быть быстрее немного в одном случае.

Move это реально другая семантика поведения программы.
С RVO может и одинаково с точки зрения какого-нибудь unspecific behavior, но не одинаково абсолютно, т.к. при возвращении никакой конструктор не вызывается (ни копирования, ни перемещения).

Отсутствие семантики RVO не мешает стандартизовать поведение компилятора.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070595
ZyK_BotaNможет это связанно с введением rvalue references?
Может быть. А именно, что помешало стандартизовать RVO?
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38070778
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move ConstrucА почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
RVO ведь по сути и быстрее и проще.
Не надо тратить время на описание конструктора перемещения и машине не надо его исполнять.
RVO уже стандартизовано давно тем что разрешено устранять копирование промежуточных переменных, если это не изменит смысл программы.
Поэтому не "вместо", а "в добавок к".

И возможность перемещения ввели не только для конструкторов, но и для присвоения (и вообще любых операций), где RVO неприменимо.
С другой стороны RVO применимо и для именованных переменных, а move - только для временных.
Так что это две взаимно дополняющие друг друга концепции.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071241
Anatoly MoskovskyИ возможность перемещения ввели не только для конструкторов, но и для присвоения (и вообще любых операций), где RVO неприменимо.
В принципе да. Для кода:
Код: plaintext
1.
2.
3.
int a = 1;
// ...
a = func();


Move Constructor подойдет, а RVO нет.

Anatoly MoskovskyС другой стороны RVO применимо и для именованных переменных, а move - только для временных.
А можно пример, что здесь имеется ввиду?
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071256
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move Construc
Код: plaintext
1.
2.
3.
int a = 1;
// ...
a = func();


Move Constructor подойдет, а RVO нет.

Здесь не move-constructor, а move-assignment
Anatoly MoskovskyС другой стороны RVO применимо и для именованных переменных, а move - только для временных.
А можно пример, что здесь имеется ввиду?
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T(a); 
}


В выражении T(a) нет возможности вызвать move конcтруктор, т.к. a - не r-value.
А RVO может сработать и вообще удалить это создание промежуточного объекта.
Другое дело что не все компиляторы умеют вычислять такие вещи как цепочки присвоений. Видно такой анализ сильно замедляет компиляцию.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071262
Anatoly Moskovskyпропущено...

А можно пример, что здесь имеется ввиду?
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T(a); 
}


В выражении T(a) нет возможности вызвать move конcтруктор, т.к. a - не r-value.
А RVO может сработать и вообще удалить это создание промежуточного объекта.
Другое дело что не все компиляторы умеют вычислять такие вещи как цепочки присвоений. Видно такой анализ сильно замедляет компиляцию.
Она не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?

Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T().swap(a); 
}
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071287
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?

Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T().swap(a); 
}


Да. Хотя иногда компилятор может определять неиспользуемые именованные переменные и трактовать их как временные r-value.

По-кошерному так делается r-value:
Код: plaintext
1.
std::move(a)


Внутри оно может и то же самое, но синтаксически видно что имеется в виду.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071289
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071293
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически
Ну а вот так:
Код: plaintext
1.
return a + a;


:)
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071295
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это я к тому что во многих частных случаях в результате оптимизации возможно неявное приведение к r-value, но не в общем случае.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071299
egorychвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически
Код: plaintext
1.
2.
3.
if (a == 1) return a;
else ++a;
return a;
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071300
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyЭто я к тому что во многих частных случаях в результате оптимизации возможно неявное приведение к r-value, но не в общем случае.да, понял, спасибо
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071306
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move Construcegorychпропущено...
чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически
Код: plaintext
1.
2.
3.
if (a == 1) return a;
else ++a;
return a;

ну и где здесь использование "a", после выполнения операции return?
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071311
ZyK_BotaNвместо RVO сделали Move Construcпропущено...

Код: plaintext
1.
2.
3.
if (a == 1) return a;
else ++a;
return a;

ну и где здесь использование "a", после выполнения операции return?

Код: plaintext
1.
2.
3.
4.
5.
T a = 1;
T_lock(a)
return a;
}
// тут вызывается деструктор T_lock, который допустим изменяет a


Кстати, в этом случае и RVO сработает до вызова этого деструктора.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071312
Anatoly Moskovskyвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?

Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T().swap(a); 
}


Да. Хотя иногда компилятор может определять неиспользуемые именованные переменные и трактовать их как временные r-value.

По-кошерному так делается r-value:
Код: plaintext
1.
std::move(a)


Внутри оно может и то же самое, но синтаксически видно что имеется в виду.
Т.е. для этого гипотетического примера в идеале что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return std::move(T(std::move(a))); 
}



или что безусловно правильней:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return std::move(a); 
}
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071314
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move ConstrucТ.е. для этого гипотетического примера в идеале что-то типа:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return std::move(T(std::move(a))); 
}





Не, move для T() бессмысленен.

Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T(std::move(a)); 
}


Кстати это реальный пример - GCC (в том числе и относительно новый) без явного std::move не хочет задействовать move конструктор.

А второй пример он конечно правильный, но move лишь вносит оверхед, т.к. компилятор и так RVO применит, а move его может заставить сделать лишний экземпляр (скорее всего так и будет).
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071315
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return T(std::move(a)); 
}


Кстати это реальный пример - GCC (в том числе и относительно новый) без явного std::move не хочет задействовать move конструктор.

А второй пример он конечно правильный, но move лишь вносит оверхед, т.к. компилятор и так RVO применит, а move его может заставить сделать лишний экземпляр (скорее всего так и будет).
А если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T f()
{
   T a;
   if (a == 1) return a + a;

   return a; 
}


Сработает ли RVO и если не сработает, то сработает ли move?
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071320
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вместо RVO сделали Move ConstrucА если так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T f()
{
   T a;
   if (a == 1) return a + a;

   return a; 
}


Сработает ли RVO и если не сработает, то сработает ли move?
Техника RVO в современных компиляторах довольно прилично реализована, так что в таких простых случаях RVO всегда применяется.
Ну а для return a - еще и move (в отличие от return T(a) ).
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071322
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А хотя для return a после RVO никакой move не нужен, т.к. a будет создано прямо в результате куда присваивается функция.
Так что move не будет.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071328
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще поправка. На этот раз экспериментальная :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T f()
{
   T a;
   if (a == 1) return a + a;

   return a; 
}


Видимо это уже сложный код для оптимизатора GCC, т.к. там для return a RVO не срабатывает и будет копирование (или move если есть такой конструктор). Я несколько разочарован :)
А для ветки return a + a - RVO срабатывает.
И для функции попроще тоже срабатывает:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return a; 
}
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071333
Фотография ZyK_BotaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
з.ы. за что я люблю хацкель, что там такой проблемы нет в принципе.

компилятор, при возврате значения, что хочет, то и делает. на корректность работы программы это не как не повлияет.
...
Рейтинг: 0 / 0
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
    #38071335
Anatoly MoskovskyЕще поправка. На этот раз экспериментальная :)

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
T f()
{
   T a;
   if (a == 1) return a + a;

   return a; 
}


Видимо это уже сложный код для оптимизатора GCC, т.к. там для return a RVO не срабатывает и будет копирование (или move если есть такой конструктор). Я несколько разочарован :)
А для ветки return a + a - RVO срабатывает.
И для функции попроще тоже срабатывает:
Код: plaintext
1.
2.
3.
4.
5.
T f()
{
   T a;
   return a; 
}


http://ideone.com/sD6Qn6
Но тут наверное компилится без оптимизации.

Сходу не могу придумать пример близкий к реальности, чтобы при включенной оптимизации и RVO не сработал и move constructor не сработал и пришлось писать return std::move(a);
...
Рейтинг: 0 / 0
25 сообщений из 26, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]