Не возвращается оптимизация стоимости (RVO) ошибка?

StackOverflow https://stackoverflow.com/questions/3905869

  •  29-09-2019
  •  | 
  •  

Вопрос

Я, возможно, задаю тупой вопрос, но я посмотрел на страницу Википедии для РВО здесь и не мог перестать удивляться, если это поведение неправильно. Я попробовал это в своей машине, и RVO полностью пнул, несмотря на уровень оптимизации. Что если бы на самом деле было что-то БОЛЬШОЙ происходит в конструкторе? Я знаю, что это не должно, но что если? Я не могу понять, почему RVO все равно произойдет, когда в конструкторе есть побочные эффекты.

РЕДАКТИРОВАТЬ: -fno-elide-constructors кажется, остановит РВО. Но вопрос остается.

Редактировать2: На более серьезной записке, сколько людей знают о чем-то вроде этого? Это может быть в стандарте, но это все еще действительно уродливая особенность, когда я вижу это. По крайней мере, компиляторы должны отключить его по умолчанию и предоставить переход для людей, которые знают об этом. :)

Править 3: Я все еще настаиваю на том, что это действительно плохо. :). Я не думаю, что знаю о любом другом языковом ограничении, который идет прямо против синтаксиса языка. Все остальное бросает либо компиляторы, либо ошибки связи, верно?

Это было полезно?

Решение

Стандартные мандаты, которые операции с проблемой программы наблюдаемое состояние не должен быть оптимизирован, За исключением копирования строительства в определенных обстоятельствах. Вы не должны полагаться на копии конструкторов, которые должны быть выполнены, даже если у них есть побочные эффекты, которые вы ожидаете увидеть (например, вывод консоли).

Другие советы

Как сказано в других ответах, компилятор допускается оптимизировать даже нетривиальные конструкторы копирования и операторы назначения.

12.8.15

Когда определенные критерии выполняются, реализация разрешается опустить копию конструкции объекта класса, Даже если конструктор копирования и / или деструктор для объекта имеют побочные эффекты. Отказ В таких случаях реализация обрабатывает источник и цель пропущенной операции копирования как просто два разных способа ссылки на тот же объект, а разрушение этого объекта происходит в более поздние времена, когда два объекта были бы уничтожены без оптимизация. Этот отзыв операций копирования разрешен в следующих обстоятельствах (которые могут быть объединены для устранения нескольких копий):

- В операторе возврата в функции с типом возврата класса, когда выражение является названием ненулительного автоматического объекта с одинаковым CV-неквасивным типом, что и тип возврата функции, операция копирования может быть опущена путем создания автоматического объект непосредственно в возвращаемое значение функции

- Когда объект временного класса, который не был связан со ссылкой (12.2), будет скопирован на объект класса с одним и тем же CV-неквасифицированным типом, операция копирования может быть опущена путем построения временного объекта непосредственно в цель опущенного скопировать

Определите «неправильно». Язык C ++ явно разрешает эту оптимизацию, даже если оно наблюдается. Если поведение вашей программы зависит от конкретной реализации, то к сожалению, вы не используете ISO C ++, но какой-то диалект.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top