std::function : c++ 표준 라이브러리에서 사용하는 함수를 감싸주는 wrapper 객체이며, 어떤 형태의 함수든 담을 수 있는 가변형 함수 포인터 입니다.
std::function 함수는 작은 람다식이나 작은 캡쳐가 들어오면 sbo(small buffer optimize)라는 작은 메모리 공간을 사용하지만, 큰 람다식이나 this 같은 객체 캡쳐가 들어오면 가상 메모리 테이블인 vtabel을 사용합니다.
vtabel 사용이유 : function에는 다양한 함수, 람다식, 멤버 함수 등을 하나의 인터페이스로 제공 해야합니다. 각기 다른 형태를 하나의 인터페이스로 제공하기 위해서는 다형성 사용이 필수적이며 동적바인딩인 런타임에서 함수가 결정되기에 vtable과 vptr을 이용합니다. vtable이 없으면 다양한 함수, 람다식, 멤버 함수 등을 하나의 인터페이스로 호출 할 수 없습니다.
vtable 역할 : 소멸자, 복사 생성자, 호출 연산자(operator())의 주소를 관리하며, 런타임에 vptr로 적절한 함수를 호출 할 수 있도록 해줍니다.
함수 포인터 : 함수의 주소를 저장하는 포인터입니다. 특정 함수 호출할 때, 동적으로 함수 호출이 가능합니다.
차이점
1. 유연성 - 함수 포인터는 함수 포인터만 지원하지만, function 함수는 함수 포인터, 람다, 멤버 함수, 함수 객체를 사용하기에 더 유연합니다.
2. 메모리 - 함수 포인터는 8바이크의 크기만 할당 받기에 메모리가 작지만, function 함수는 동적 할당 될 가능성이 있기에 메모리 효율 면에선 함수 포인터가 좋습니다.
3. 성능 - 함수 포인터는 직접 호출하기에 빠르지만, function 함수는 가상 함수 테이블에서 작동하기에 느립니다.
4. 디버깅 - 함수 포인터는 디버깅 할때 어떤 함수가 호출 된지 모르는 어려움이 존재할 수 있지만, function 함수는 람다식 추적이 가능하기에 디버깅 면에서 유리합니다.
결론 : 단순한 성능이 필요하면 함수 포인터가 좋고, 유연성이 필요하면 function 함수가 유리합니다.
'C++' 카테고리의 다른 글
[C++] vtable과 vptr (0) | 2024.12.16 |
---|---|
[C++] 메모리 오버헤드 줄이기 (0) | 2024.12.15 |
[C++] 데이터 영역과 BSS영역 (0) | 2024.12.13 |
[C++] inline 함수와 함수 호출, 리턴 과정 (0) | 2024.11.26 |
[C++] 버퍼와 플러시 (0) | 2024.10.23 |