관리 메뉴

기억을 위한 기록들

[C & CPP] 람다함수의 메모리 할당에 대하여.. 본문

C & CPP

[C & CPP] 람다함수의 메모리 할당에 대하여..

에드윈H 2023. 4. 5. 22:44

언리얼엔진을 사용하다 보면 델리게이트 및 이벤트를 자주 접하다가, 가끔 유용하게 사용 하는 람다 함수에 대해 메모리 할당이 궁금해서 ChatGPT 한테 물어봤다.

 

Q. 람다함수 메모리 할당은 어떻게 돼?

 

A.

람다 함수는 컴파일러에 의해 함수 객체(function object)로 변환됩니다.

이 함수 객체는 일반적으로 람다 함수를 호출할 때 스택에 할당되며, 람다 함수에서 캡처한 변수가 있다면, 해당 변수도 스택에 저장됩니다.

람다 함수가 호출될 때, 스택에 할당된 함수 객체와 캡처된 변수는 모두 소멸됩니다.
따라서, 람다 함수의 메모리 할당은 일반적으로 스택 기반으로 이루어지며, 람다 함수의 호출 또한 스택 기반으로 이루어집니다.

그러나, 람다 함수가 함수 객체로 변환될 때, 람다 함수의 구현 코드와 캡처된 변수가 함수 객체의 멤버 함수 및 멤버 변수로 이동됩니다.  이렇게 이동된 구현 코드와 캡처된 변수는 함수 객체를 구성하는 데이터 멤버로서 힙(heap)에 할당됩니다.


따라서, 람다 함수의 구현 코드와 캡처된 변수는 함수 객체가 할당된 힙의 메모리 공간에 저장됩니다. 

힙에 할당된 이유는, 람다 함수가 반환될 때 함수 객체가 유효한 상태로 유지되어야 하기 때문입니다. 함수 객체가 힙에 할당되면, 함수 객체는 람다 함수가 반환될 때까지 존재하며, 필요한 경우 람다 함수를 호출할 때마다 재사용됩니다.
그러므로, 람다 함수의 메모리 할당은 스택과 힙 모두에서 이루어집니다.

이라고한다.

 

정리하자면, 호출할때엔 스택에 할당되고, 캡처한 변수가 있다면 변수도 스택에 저장된다.

근데 함수 객체로서 변환될때엔 데이터 멤버로 힙에 할당되는데, 람다 함수 반환시 까지 유효한 상태로 유지되어야 하기 때문이라고 한다. 그리고 필요한 경우 람다 함수를 호출할때마다 재사용 한다,

 

결론은 스택, 힙 메모리 둘다 사용된다!