C++ 함수 객체

함수 객체와 상태 전달

함수 객체, 람다, std::function은 모두 호출 가능하지만 비용과 타입 정보가 다르다. 알고리즘에 넘길 때 캡처 수명, inline 가능성, type erasure 비용을 같이 본다.

01

호출 형태

함수 포인터, 함수 객체, 람다 중 상태가 필요한지로 선택한다.

상태 필요 여부
02

캡처 수명

참조 캡처가 알고리즘 실행 시점까지 살아 있는지 확인한다.

dangling 위험
03

타입 보존

템플릿 인자로 callable을 받으면 구체 타입이 유지되어 inline 최적화가 쉽다.

generic callable
04

타입 소거

저장·교체가 필요하면 std::function을 쓰되 할당과 간접 호출 비용을 고려한다.

편의와 비용
Functor
명명된 상태와 재사용 여러 함수에서 같은 비교 정책이나 누적 상태를 공유하기 쉽다.
명시적 타입
Lambda
지역 문맥에 가까운 조건 짧은 predicate나 comparator를 호출 지점 가까이에 둘 수 있다.
캡처 점검
std::function
동일 시그니처 저장 서로 다른 callable을 한 변수에 담지만 type erasure 비용이 있다.
빈 호출 검사
function_ref
비소유 callable view 표준 전에는 직접 구현이나 라이브러리 타입을 쓰며 수명 책임은 호출자에게 있다.
저장 금지

참조 캡처 · 비용 · 비교 상태 점검

참조 캡처 비동기 실행이나 저장되는 callable에 지역 참조가 들어가지 않았는지 확인한다.
비용 핫 루프에서 std::function 간접 호출과 allocation이 문제가 되는지 측정한다.
비교 상태 정렬 comparator가 호출 중 상태를 바꿔 순서 관계를 흔들지 않는지 본다.