Есть фактически две копии выполняются на каждом Range
объект передается в конструктор. Первое происходит при копировании временного объекта Range
в параметр функции. Это можно отбросить в соответствии с рекомендацией, приведенной в ответе 101010. Есть specific circumstances, в котором может выполняться копирование.
Вторая копия происходит при копировании параметра функции в член (как указано в списке инициализации конструктора). Это невозможно устранить, и поэтому вы все равно видите, что для каждого параметра в ответе YSC делается одна копия.
Когда конструктор копирования имеет побочные эффекты (например, отпечатки в ответе YSC), копирование elision все равно может выполняться для первой копии, но вторая копия должна оставаться.
Однако компилятор всегда может вносить изменения, если они не изменяют наблюдаемое поведение программы (это известно как правило «как-если»). Это означает, что если конструктор копирования не имеет побочных эффектов и удаление вызова конструктора не изменит результат, компилятор может удалить даже вторую копию.
Вы можете увидеть это, проанализировав сгенерированную сборку. В this example, компилятор оптимизирует из не только копии, но даже строительство самого Box
объекта:
Box box(Range(a,b),Range(c,d));
std::cout << box.x.from;
Формирует идентичную сборку как:
std::cout << a;
Возможно, это могло бы быть улучшено, если бы вы более четко указали, что здесь есть две вещи: (1) Копировать Elision, которая позволяет копировать копии независимо от того, как реализован конструктор/деструктор копирования, является специальным правилом C++ и (2) Правило If, которое позволяет исключить любой код, который не изменяет поведение, является общим правилом оптимизатора.Другие ответы не удались (2), потому что они начали использовать вызовы конструктора/деструктора копирования, чтобы засвидетельствовать копии, которые, в свою очередь, препятствовали правилу «Как было» и, таким образом, оптимизаторы сохраняли поведение копии. –
@ MatthieuM. Я редактировал, чтобы надеяться сделать различие более ясным. – interjay
Это кажется более ясным, спасибо :) –