Я искал this статью о NRVO.понимание вызова конструктора копирования и названная оптимизация возвращаемого значения
class RVO
{
public:
RVO(){
printf("I am in constructor\n"); }
RVO(const RVO& c_RVO) {
printf("I am in copy constructor\n"); }
~RVO(){
printf("I am in destructor\n"); }
int mem_var;
};
RVO MyMethod(int i)
{
RVO rvo;
rvo.mem_var = i;
return (rvo);
}
int main()
{
RVO rvo;
rvo=MyMethod(5);
}
Выход следующие на визуальной студии, и это, как я понимаю
I am in constructor // main rvo construction
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying temporary in MyMethod
I am in destructor //Destroying rvo of main
Если вместо этого я пишу главным, как
int main()
{
RVO rvo = MyMethod(5);
return 0;
}
Выход заключается в следующем, и как это понимается
I am in constructor //MyMethod rvo construction
I am in copy constructor //temporary created inside MyMethod
I am in destructor //Destroying rvo in MyMethod
I am in destructor //Destroying rvo of main
Почему временная не разрушена в Mymethod
во второй версии?
Почему конструктор копирования не вызывается в RVO rvo = MyMethod(5);
.I думаю, конструктор копирования должен быть вызван дважды во второй версии, один для временного создается внутри Mymethod
, а другой для RVO rvo = MyMethod(5);
Я знаю, что некоторые называют могут получать elided.Can кто-то пожалуйста, помощь в объяснении этих вызовов.
EDIT: Использование return rvo
вместо return (rvo)
изменяет выход как
Первый случай
I am in constructor
I am in constructor
I am in destructor
I am in destructor
второй случай
I am in constructor
I am in destructor
Думаю, когда я удалены скобки, то NRVO умирает . Но меня больше интересует первый вывод, когда нет оптимизации
Есть что-то подозрительное в отношении вывода второго примера. Любой резонирующий компилятор должен применять RVO, поэтому вы не должны получать вызов конструктора копии. –
@ Cheersandhth.-Alf см. Это http://ideone.com/S5Kqn9 –
Удалите круглые скобки вокруг возвращаемого выражения. –