방프리

25.02.23 최신 C++ 개념 2일차 (std::function 개념론) 본문

C++/고성능을 위한 언어 C++

25.02.23 최신 C++ 개념 2일차 (std::function 개념론)

방프리 2025. 2. 23. 21:06

1. C 함수 포인터를 람다에 할당

  • 람단는 일반 함수 포인터로 변환이 가능, 해당 기능 때문에 람다는 캡쳐를 전혀 가질 수 없음 
// old C library code
external void download_webpage(
    const char* url, void (*callback)(int, const char*));
    
 auto func() 
 {
     auto lambda = +[](int result, const char* str) {};
     download_webpage("http://www.packet.com", lambda);
 }

 

2. 람다와 std::function

  • 모든 람다 함수는 자신만의 타입을 가지고 있으며, 동일한 두 개의 람다가 동일한 서명을 가지고 있어도 마찬가지다.
  • std::function의 서명은 하단의 코드와 같다.
// concept of std::function sign
std::function<return_type (parameter0, paramter1...)>

// has no return value and no paramter
auto func = std::function<void(void)>{};

// return value type of bool, has two parameter. one is int type
// the other is string type
auto func = std::function<bool(int, std::string)> {};

 

3. std::functions에 람다 할당

  • 람다는 고유한 타입이 있고, 같은 함수라도 다른 람다 함수에 할당이 불가능
  • std::function은 동일한 서명을 가지고 있는 모든 람다 보유가 가능, 동일한 파라미터와 반환되는 값을 가진다.
  • 하단의 코드는 서로 다른 람다가 동일한 std::function 객체에 할당되는 코드
auto func = std::function<void(int)>{};

func = [](int v) { std::cout << v; };
func(12);

auto forty_two = 42;
func = [forty_two](int v) { std::cout << (v + forty_two); };
func(12); // 54 출력

 

4. std::function은 인라인으로 사용할 수 없다.

  • 컴파일러는 std::function으로 감싼 작은 함수가 자주 호출될 경우에는 성능에 영향이 갈 수 있다.

5. std::function의 성능 고려 사항

  • std::function의 호출은 일반적으로 추가 코드가 조금 포함되므로, 람다를 실행하는 것보다 약간 느리다.
  • std::function으로 감싼 함수의 인라인 호출이 거의 불가능하다.

'C++ > 고성능을 위한 언어 C++' 카테고리의 다른 글

25.02.10 최신 C++ 개념 1일차  (0) 2025.02.10
Comments