Когда функция возвращает объект по значению, он вызывает конструктор копирования для создания временного (если не применяется RVO). Это временное действие будет затем уничтожено после использования, например.почему конструктор копирования всегда вызывается, когда возвращает значение
MyClass function_return_by_value(MyClass par)
{
return par;
}
MyClass b;
MyClass a = function_return_by_value(b); // (1)
Но почему мы должны создавать такое временное, если оно не используется вообще? Например, почему следующий код не «оптимизирован» компилятором, чтобы пропустить временное создание и уничтожить?
MyClass b;
function_return_by_value(b); // (2)
В (1) возвращаемое значение присваивается другой переменной, и RVO может применяться. Но в (2) нет ничего, чтобы получить возвращаемое значение, почему нет оптимизации? Я пробовал gcc 4.8.4 и vC++ 2015, конструктор копирования MyClass дважды вызывается для (2) в обоих компиляторах. Почему производители компиляторов все решают сделать временное уничтожение, даже если временное не используется вообще? Почему они не могут этого избежать?
Зависит от побочных эффектов, вызываемых в вашем конструкторе копирования. –
Вам нужно взять 'par'' const MyClass & ', чтобы предотвратить вторую копию. – PSkocik
Спасибо, @PSkocik, но я думаю, вы должны сначала прочитать мои вопросы. – james