2013-04-27 3 views
5
string str="fujian"; 

Некоторые книги говорят, что код вызывает конструктор копирования, но g ++ оптимизирует его, чтобы конструктор копирования не вызывался.Почему не удается -O0 отключить gcc-компиляцию?

Однако я использовал команду g ++ -O0, чтобы отключить оптимизацию, но она по-прежнему не может вызвать конструктор копирования.

Как это понять?

+0

Как вы определяете, был ли вызван конструктор копирования? –

+0

Я переписываю конструктор копий и журнал под названием – jiafu

+0

. Я предполагаю, что в каком-то месте g ++ делает постоянное сгибание/распространение - может быть в интерфейсе. И я думаю, вы не можете отключить это. – JohnTortugo

ответ

9

С помощью GCC и Clang вы можете использовать флаг компиляции -fno-elide-constructors, чтобы отключить оптимизацию оптимизации копирования/перемещения.

+0

Почему o0 не может работать? – jiafu

+0

Я не хочу делать все, чтобы копировать тигр, но чтобы понять основной принцип, чтобы изучить – jiafu

+0

@jiafu: Я не уверен, почему '-o0' не будет препятствовать копированию/перемещению elision. Если вы хотите подавить это поведение, вам нужно использовать этот флаг. –

1

Правило разрешения копии основано на ISO C++ 12.8. В то время как другие правила, используемые в целом для оптимизации, в совокупности называются правилом «как-если» в разделе 1 (который позволяет реализации генерировать программу по-разному с «неоптимизированной» семантикой программы на основе модели абстрактной машины), это правило что вы можете относиться к «оптимизированному» коду, ведет себя так же точно, как и исходное значение. Другими словами, вызванные вызовы конструктора могут вообще не существовать в поведении абстрактной машины.

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

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

WG21/N4296

1,9 Выполнение программы

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

8 Наименее требования в соответствующей реализации является:

(8,1) - Доступ к летучим объектам оцениваются строго в соответствии с правилами абстрактной машины.

(8.2) - При завершении программы все данные, записанные в файлы, должны быть идентичны одному из возможных результатов, которые должно было выполнить выполнение программы в соответствии с абстрактной семантикой.

(8.3) - Динамика входных и выходных сигналов интерактивных устройств должна происходить таким образом, чтобы выводить вывод , прежде чем программа ждет ввода. Что представляет собой интерактивное устройство является реализацией.

Все эти данные обозначаются как наблюдаемое поведение программы. [Примечание. Более строгие соответствия между абстрактной и фактической семантикой могут быть определены каждой реализацией. -end примечание]

12,8 Копирование и перемещение объектов класса

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

...

Смежные вопросы