Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor? RVO ведь по сути и быстрее и проще. Не надо тратить время на описание конструктора перемещения и машине не надо его исполнять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2012, 21:40 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move Construc, Это вообще то разные вещи. Rvo не имеет семантики в языке. Что с, что без, программа будет работать одинаково логически, но может быть быстрее немного в одном случае. Move это реально другая семантика поведения программы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2012, 22:03 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
может это связанно с введением rvalue references? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2012, 22:08 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
MasterZivвместо RVO сделали Move Construc, Это вообще то разные вещи. Rvo не имеет семантики в языке. Что с, что без, программа будет работать одинаково логически, но может быть быстрее немного в одном случае. Move это реально другая семантика поведения программы. С RVO может и одинаково с точки зрения какого-нибудь unspecific behavior, но не одинаково абсолютно, т.к. при возвращении никакой конструктор не вызывается (ни копирования, ни перемещения). Отсутствие семантики RVO не мешает стандартизовать поведение компилятора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2012, 22:35 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNможет это связанно с введением rvalue references? Может быть. А именно, что помешало стандартизовать RVO? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.12.2012, 22:36 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move ConstrucА почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor? RVO ведь по сути и быстрее и проще. Не надо тратить время на описание конструктора перемещения и машине не надо его исполнять. RVO уже стандартизовано давно тем что разрешено устранять копирование промежуточных переменных, если это не изменит смысл программы. Поэтому не "вместо", а "в добавок к". И возможность перемещения ввели не только для конструкторов, но и для присвоения (и вообще любых операций), где RVO неприменимо. С другой стороны RVO применимо и для именованных переменных, а move - только для временных. Так что это две взаимно дополняющие друг друга концепции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 06:58 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyИ возможность перемещения ввели не только для конструкторов, но и для присвоения (и вообще любых операций), где RVO неприменимо. В принципе да. Для кода: Код: plaintext 1. 2. 3. Move Constructor подойдет, а RVO нет. Anatoly MoskovskyС другой стороны RVO применимо и для именованных переменных, а move - только для временных. А можно пример, что здесь имеется ввиду? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 23:23 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move Construc Код: plaintext 1. 2. 3. Move Constructor подойдет, а RVO нет. Здесь не move-constructor, а move-assignment Anatoly MoskovskyС другой стороны RVO применимо и для именованных переменных, а move - только для временных. А можно пример, что здесь имеется ввиду? Код: plaintext 1. 2. 3. 4. 5. В выражении T(a) нет возможности вызвать move конcтруктор, т.к. a - не r-value. А RVO может сработать и вообще удалить это создание промежуточного объекта. Другое дело что не все компиляторы умеют вычислять такие вещи как цепочки присвоений. Видно такой анализ сильно замедляет компиляцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 23:49 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyпропущено... А можно пример, что здесь имеется ввиду? Код: plaintext 1. 2. 3. 4. 5. В выражении T(a) нет возможности вызвать move конcтруктор, т.к. a - не r-value. А RVO может сработать и вообще удалить это создание промежуточного объекта. Другое дело что не все компиляторы умеют вычислять такие вещи как цепочки присвоений. Видно такой анализ сильно замедляет компиляцию. Она не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться? Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.12.2012, 23:59 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться? Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа: Код: plaintext 1. 2. 3. 4. 5. Да. Хотя иногда компилятор может определять неиспользуемые именованные переменные и трактовать их как временные r-value. По-кошерному так делается r-value: Код: plaintext 1. Внутри оно может и то же самое, но синтаксически видно что имеется в виду. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:20 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:23 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
egorychвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически Ну а вот так: Код: plaintext 1. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:29 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Это я к тому что во многих частных случаях в результате оптимизации возможно неявное приведение к r-value, но не в общем случае. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:30 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
egorychвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться?чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:47 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЭто я к тому что во многих частных случаях в результате оптимизации возможно неявное приведение к r-value, но не в общем случае.да, понял, спасибо ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 01:47 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move Construcegorychпропущено... чё? после return ничего из локального не может дальше использоваться, ни теоретически, ни практически Код: plaintext 1. 2. 3. ну и где здесь использование "a", после выполнения операции return? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:08 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
ZyK_BotaNвместо RVO сделали Move Construcпропущено... Код: plaintext 1. 2. 3. ну и где здесь использование "a", после выполнения операции return? Код: plaintext 1. 2. 3. 4. 5. Кстати, в этом случае и RVO сработает до вызова этого деструктора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:16 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovskyвместо RVO сделали Move ConstrucОна не считается r-value потому, что по общему смыслу после return теоретически a может и дальше использоваться? Т.е. без RVO здесь нужно явно вызывать перемещение, что-то типа: Код: plaintext 1. 2. 3. 4. 5. Да. Хотя иногда компилятор может определять неиспользуемые именованные переменные и трактовать их как временные r-value. По-кошерному так делается r-value: Код: plaintext 1. Внутри оно может и то же самое, но синтаксически видно что имеется в виду. Т.е. для этого гипотетического примера в идеале что-то типа: Код: plaintext 1. 2. 3. 4. 5. или что безусловно правильней: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:20 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move ConstrucТ.е. для этого гипотетического примера в идеале что-то типа: Код: plaintext 1. 2. 3. 4. 5. Не, move для T() бессмысленен. Код: plaintext 1. 2. 3. 4. 5. Кстати это реальный пример - GCC (в том числе и относительно новый) без явного std::move не хочет задействовать move конструктор. А второй пример он конечно правильный, но move лишь вносит оверхед, т.к. компилятор и так RVO применит, а move его может заставить сделать лишний экземпляр (скорее всего так и будет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:31 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly Moskovsky Код: plaintext 1. 2. 3. 4. 5. Кстати это реальный пример - GCC (в том числе и относительно новый) без явного std::move не хочет задействовать move конструктор. А второй пример он конечно правильный, но move лишь вносит оверхед, т.к. компилятор и так RVO применит, а move его может заставить сделать лишний экземпляр (скорее всего так и будет). А если так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Сработает ли RVO и если не сработает, то сработает ли move? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 02:38 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
вместо RVO сделали Move ConstrucА если так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. Сработает ли RVO и если не сработает, то сработает ли move? Техника RVO в современных компиляторах довольно прилично реализована, так что в таких простых случаях RVO всегда применяется. Ну а для return a - еще и move (в отличие от return T(a) ). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 03:02 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
А хотя для return a после RVO никакой move не нужен, т.к. a будет создано прямо в результате куда присваивается функция. Так что move не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 03:08 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Еще поправка. На этот раз экспериментальная :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. Видимо это уже сложный код для оптимизатора GCC, т.к. там для return a RVO не срабатывает и будет копирование (или move если есть такой конструктор). Я несколько разочарован :) А для ветки return a + a - RVO срабатывает. И для функции попроще тоже срабатывает: Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 03:14 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
з.ы. за что я люблю хацкель, что там такой проблемы нет в принципе. компилятор, при возврате значения, что хочет, то и делает. на корректность работы программы это не как не повлияет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 03:25 |
|
||
|
А почему в новом стандарте C++11 вместо стандартизации RVO сделали Move Constructor?
|
|||
|---|---|---|---|
|
#18+
Anatoly MoskovskyЕще поправка. На этот раз экспериментальная :) Код: plaintext 1. 2. 3. 4. 5. 6. 7. Видимо это уже сложный код для оптимизатора GCC, т.к. там для return a RVO не срабатывает и будет копирование (или move если есть такой конструктор). Я несколько разочарован :) А для ветки return a + a - RVO срабатывает. И для функции попроще тоже срабатывает: Код: plaintext 1. 2. 3. 4. 5. http://ideone.com/sD6Qn6 Но тут наверное компилится без оптимизации. Сходу не могу придумать пример близкий к реальности, чтобы при включенной оптимизации и RVO не сработал и move constructor не сработал и пришлось писать return std::move(a); ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2012, 03:39 |
|
||
|
|

start [/forum/topic.php?fid=57&fpage=88&tid=2020606]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
25ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
57ms |
get tp. blocked users: |
2ms |
| others: | 12ms |
| total: | 138ms |

| 0 / 0 |
