GameDevelop/Notes

함수 포인터, 함수 객체, 람다

Une_ 2026. 1. 20. 16:25

한 줄 요약

함수 포인터는 주소,
함수 객체는 객체,
람다는 익명 함수 객체다.

 

함수 포인터 (Function Pointer)

함수의 주소를 저장하는 포인터

int Add(int a, int b) {
    return a + b;
}

int (*FuncPtr)(int, int) = Add;
int result = FuncPtr(1, 2);

 

 

함수의 이름이 곧 주소이기 때문에, 함수의 이름을 포인터로 저장하거나 매개변수로 넘겨줄 때 함수 포인터를 사용하게 된다.

 

간편하지만 상태(누적값, 이전 호출 결과 등)를 가질 수 없기 때문에 주로 전역 함수나 static 함수가 사용된다.

 

STL 알고리즘은 Callable을 요구하며, 함수 포인터도 사용할 수 있지만함수 객체나 람다가 더 일반적이다.

STL에서 조건자로서 사용할 수 있지만 함수를 호출하러 점핑하면서 오버헤드가 생긴다.

 

함수 포인터 호출은 간접 호출 -> 컴파일러가 실제 호출 함수를 알 수 없어 인라인화가 거의 불가능

= 인라인 최적화 어려움.

함수 객체 (Functor)

operator()를 오버로딩한 클래스

struct AddFunctor {
    int operator()(int a, int b) const {
        return a + b;
    }
};

AddFunctor add;
int result = add(1, 2);

클래스를 선언하고 함수호출연산자를 오버로딩해주어야 한다.

클래스를 함수처럼 사용하는 것이다. 

클래스이기 때문에 멤버 변수를 통해 상태를 가질 수 있어 일반 함수보다 사용자화하기 쉽다.

컴파일 타임에 호출 대상이 명확해, 컴파일러가 인라인 최적화를 적용하기 쉬워 함수 포인터보다 성능상 유리할 수 있다.

STL에서 조건자로서 자주 사용된다.

람다 (Lambda Expression)

익명 함수 객체를 간결하게 표현한 문법

auto add = [](int a, int b) {
    return a + b;
};

내부적으로는 컴파일러가 함수 객체 클래스를 생성

 

함수객체와 거의 비슷하지만 더 간편하게 사용할 수 있고 가독성이 좋다.

이름이 없는 익명 함수 객체이다.

컴파일 타임에 호출 대상이 명확해, 컴파일러가 인라인 최적화를 적용하기 쉬워 함수 포인터보다 성능상 유리할 수 있다.

함수객체를 별도로 생성하지 않아도 됨 (함수객체는 정의하고 선언해야 사용가능했다.)


[간편함]

람다 >= 함수 포인터 > 함수 객체

 

[성능]

람다 >= 함수 객체 > 함수 포인터


람다는 편리하지만 캡처 방식과 생명주기를 잘못 다루면
댕글링 참조나 크래시로 이어질 수 있기 때문에
명시적 캡처와 수명 관리가 중요!

'GameDevelop > Notes' 카테고리의 다른 글

퀵 정렬 (Quick Sort)  (0) 2026.01.26
렌더링 파이프라인  (0) 2026.01.20
싱글톤 패턴 (Singleton Pattern)  (1) 2026.01.11
옵저버 패턴 (Observer Pattern)  (0) 2026.01.11
가상 함수 테이블 (Virtual Table, vtable)  (0) 2026.01.11