jeekpark / comments-issue

0 stars 0 forks source link

categories/cpp/RVO-NRVO/ #4

Open utterances-bot opened 2 months ago

utterances-bot commented 2 months ago

RVO, RNVO 객체 반환 최적화 기법 | jeekpark

쓸데 없는 메모리 복사를 방지해봅시다

https://jeekpark.github.io/categories/cpp/RVO-NRVO/

Taeil-Nam commented 2 months ago

RVO, NRVO 최적화가 적용되지 않았을 때 만들어지는 임시 객체는 어떤 메모리에 저장되는지 궁금합니다!

jeekpark commented 2 months ago

Foo createTempFoo() { return Foo(); // 임시 객체 반환 }

int main() { Foo myFoo = createTempFoo(); return 0; }

위의 상황으로 간단한 스택메모리 레이아웃을 만들어보면

[createTempFoo 스택프레임] [임시객체] [반환주소] [main 스택프레임]

이런 구조라서 RVO가 작동되지 않으면 createTempFoo함수가 끝났을 때 다시 main 중간의 호출되었던 명령어 위치를 가리키는 반환 주소를 통해 값을 다시 복사하게 됩니다.

임시객체는 createTempFoo가 끝났을때 함께 pop이 되어버리니 createTempFoo 스택프레임의 일부라고 간주해도 좋을 것 같습니다.

즉 RVO가 작동된다면 임시객체에 넣는 과정 없이 (컴파일러가 임시객체를 PUSH하지 않고) 바로 main의 변수에 생성자를 꽂아버릴 수 있어요

jeekpark commented 2 months ago

김포프 선생님의 C++ r-value, move 세먼틱스 파트에도 값이 여러번 복사된다는 내용 설명되어 있어요~!

jeekpark commented 2 months ago

*정정 내용

"문법 레벨에서 직접 RVO/NRVO를 처리할 수 없다. 대신 컴파일러가 알아서 최적화를 해준다. 그렇기 때문에 개발자는 컴파일러가 최적화할 수 있는 상황을 만들어주는 것이 최선이다."

-> r-value와 이동생성자를 통해 직접 최적화가 가능합니다

Taeil-Nam commented 2 months ago

감사합니다!