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

이 블로그의 인기 게시물

내일배움캠프 사전캠프 - 사전캠프설 연휴 커피 파밍 이벤트 작품 [ EXTREMITY ]

내일배움캠프 29일차 - 커리어데이 2일차 : 클라이언트 프로그래머로서 포트폴리오, 입사준비팁