220825)함수 포인터, Lambda 함수, thiscall
함수 포인터
함수의 주소를 가리킬 수 있는 포인터 변수. [(반환값 자료형) (*포인터명)(매개변수 자료형...)]의 꼴로 선언할 수 있다. 선언한 포인터의 반환값과 매개변수와 같은 자료형을 가진 함수를 저장할 수 있다.
(예시)
함수 포인터 선언: float (*fp)(int, int);
저장할 수 있는 함수: float Func(int a, int b);
함수를 포인터에 저장: fp = Func;
함수 포인터를 통한 호출: fp(3, 5);
C++ 11부터는 using을 사용하면 특정 함수 포인터에 대한 별칭을 만들 수 있다.
using funcPt = float(*)(int, int);
또한 C++ 11부터 표준 라이브러리 <functional> 헤더를 통해 std::function을 사용한 함수 포인터의 정의가 가능하다.
----
#include <functional>
std::function<float(int, int)> funcPt;
funcPt = Func; // float Func(int a, int b)꼴로 선언된 함수;
funcPt(3, 5);
----
Lambda 함수
익명의 함수를 정의할 수 있는 방법. 함수가 호출되거나 인수로 사용되는 위치에서 즉석으로 함수를 정의하여 캡슐화하는 데에 사용된다.
람다식은 다음과 같이 정의한다.
---
[캡쳐 블록](매개변수 목록) mutable throw() -> 반환자료형 { 함수 내용 }
※ 기울임체는 생략가능한 코드
---
함수 호출 규약 - thiscall
함수의 호출 규약은 함수 호출 시 전달된 매개변수를 함수가 종료될 때 정리하는 방법으로서 cdecl, stdcall, fastcall, thiscall 4가지가 존재한다. 이 중 thiscall은 C++언어의 멤버함수에서 쓰이고 나머지는 C언어에서 사용된다.
thiscall은 ecx에 인스턴스의 주소가 기억된 후 호출되는 함수이다. 그 외에는 매개변수들을 전달받은 스택을 함수 내부에서 처리하고(stdcall), 가변인수를 사용하는 함수에 한해 스택으로 전달한 매개변수를 함수를 호출한 위치에서 정리한다(cdecl).
자세한 참조: https://tapito.tistory.com/372