foo bar()
{
return foo();
}
int main()
{
foo a(bar());
return 0;
}
이런 코드에서 bar함수 안의 익명객체, 메인 함수 안의 a에서 각각 기본생성자랑 복사생성자가 호출되고 따로 소멸할줄 알았는데 막상 돌려보니 기본생성자 한번, 소멸자 한번만 호출되더군요(visual studio 2015기준)
컴파일러 최적화 때문일까요?
foo bar()
{
return foo();
}
int main()
{
foo a(bar());
return 0;
}
이런 코드에서 bar함수 안의 익명객체, 메인 함수 안의 a에서 각각 기본생성자랑 복사생성자가 호출되고 따로 소멸할줄 알았는데 막상 돌려보니 기본생성자 한번, 소멸자 한번만 호출되더군요(visual studio 2015기준)
컴파일러 최적화 때문일까요?
저거 copy constructor 인가 그런거라서 그런거 아님까? (C++알못)
return foo()에서 생성 한번 이거 메인으로 보내는데 임시에대한 복사생성 한번 bar내부의 소멸한번 임시객체에 대한 a의 복사한번 임시객체 소멸 a소멸
네 저두 copy constructor호출될줄 알았는데 그냥 메인에서 foo a()한거랑 완벽하게 똑같이 돌아가는거같아요 소멸타이밍이라던가도
생각보다 복사 소멸이 더 많은데 임시값은 복사 소멸이 반복되고 이걸 걍 생성 안하고 생성한것처럼 하는 최적화가 들어감
이건 컴파일러가 하는게 아니라 언어상에 문법이 있어요 rvalue에 대한 최적화인데 이것도 오버라이딩이 가능
2016//제가 딱 글케 생각했는데 foo bar(){ foo temp; return temp}면 그렇게 돌아가는데 본문처럼하면 그렇질 않더라구여
아 rvalue참조를 따로 정의 안해도 그렇게 돌아가나요? 그걸몰랏내
어차피 소멸될거에 대한 복사를 하고 소멸이 일어나는데 이런거 잡아서 복사 소멸을 생략할수있으요
RVO
move 하는게 좋아요 여러모로 - return 0;
무브시맨틱스 지금 공부중이에요 ㅋㅋ 넘나어려운시뿔뿔