근래에 동료로부터 들은 내용이라 사실 확인을 하다가 확인한 사항입니다.
처음에는 별 생각 없었는데 좀 더 생각해보니 제가 C++를 공부했을 때
Lambda의 사용 방식이나 Capture의 기능 동작은 설명이 되어 있는데
내부적으로 어떻게 동작하는지, 혹인 이런 주의 사항은 보지 못했던 것 같더군요.
요는 Lambda의 Capture를 사용하면 어떻게 값을 받아오느냐 입니다.
이를 제대로 이해하기 위해서는 Lambda가 Functor와 비교해 어떻게 구성되었느냐를 알아야 합니다.
결론부터 얘기하면 Capture가 없는 Lambda나
Call-by-Value로 Capture를 쓰는 Lambda는 일반 Functor와 거의 동일하게 구성됩니다.
하지만 Call-by-Reference로 Capture를 쓰면 구조 차이가 발생합니다.
첫번째로, Reference 된 Parameter가 Pointer로 참조가 됩니다.
여기서 이 글의 가장 중요한 전달사항이 나옵니다.
Lambda의 Capture는 Call-by-Reference더라도 Pointer이기 때문에 Pointer Dangling이 발생할 수 있습니다.
이는 Lambda가 비동기적으로 생성되는 경우,
즉 네트워크나 쓰레드와 사용하는 경우에 Invalid Argument를 발생할 수 있습니다.
두번째로, Functor는 Constructor가 외부에 별도로 존재를 하는 반면,
Lambda의 Constructor는 그 내부에 존재를 하고있습니다.
즉, Constructor에서 발생하는 복사 작업이 요구되지 않아 일반 Functor보다 조금 더 가볍습니다. 아주 조금요.
이에 대해 자세한 설명은 원문을 본 블로그를 첨부하겠습니다.
어셈블리까지 분석을 해서 비교를 해주고 있기에 직접 포스트를 읽으시면 더 명확히 이해가 갈겁니다.
원본 포스트 출처 - https://web.mst.edu/~nmjxv3/articles/lambdas.html
C++ Lambdas Under The Hood
C++ Lambdas Under The Hood Introduction C++11 introduced lambdas, which provide a syntactically lightweight way to define functions on-the-fly. They can also capture (or close over) variables from the surrounding scope, either by value or by reference. In
web.mst.edu
'메모장 > 개발 지식' 카테고리의 다른 글
Unreal Engine 코드를 포함한 Project 생성하기 (with VCS) (0) | 2022.07.08 |
---|---|
툴팁(Tooltip) 만들기 (0) | 2022.05.05 |
Print client side log in listen server (0) | 2020.06.25 |
FObjectInitializer constructor fatal error c1853 (0) | 2020.04.20 |
UE4 2개 이상의 Layered blend per bone (2) | 2019.12.20 |