C#에서 Function Pointer 사용하기
C#의 함수 포인터(Function Pointer)는 C# 9.0부터 도입된 기능으로, 고성능 연산이나 네이티브(C++, Delphi) 라이브러리와의 연동을 위해 만들어진 가장 로우레벨한 함수 호출 방식이다.
C++의 void (*func)(int)와 동일하게 함수의 주솟값을 직접(참조) 가리킨다. 메모리 주소를 직접 다루기 때문에 반드시 unsafe 키워드가 필요하다. csproj에서 AllowUnsafeBlock를 true로 설정한다.
Delegate나 Action 같은 객체를 생성하지 않으므로, 호출 시 가비지 컬렉터(GC) 오버헤드가 없고 CPU가 즉시 해당 주소로 점프하므로 제로 오버헤드로 볼 수 있다.
함수 포인터의 기본 문법은 delegate* 키워드를 사용하여 선언하며, 마지막 파라미터가 리턴 타입이 된다.
1
2
3
4
5
6
7
8
// 선언: <매개변수1, 매개변수2, 리턴타입>
delegate*<int, int, int> addPtr;
// 할당: & 연산자로 정적(static) 함수의 주소를 가져옴
addPtr = &MyStaticFunction;
// 호출: 일반 함수처럼 호출
int result = addPtr(10, 20);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// Program.cs
using System;
namespace ConsoleApp;
internal class Program
{
private static void Main()
{
MathEngine math = new();
double resulMath = math.Execute(OpType.Divide, 3, 0);
if (double.IsNaN(resulMath))
{
Console.WriteLine($"Error: {resulMath}");
}
else
{
Console.WriteLine(resulMath);
}
}
}