📌 함수 포인터 활용

고속 처리

 

int main(void)
{	
	int instructions[1024] = { 0 };
	int pc = 0;

	while (instructions[pc])
	{
		switch (instructions[pc])
		{
		case 1: //add
			break;
		case 2: //sub
			break;
		case 3: //mul
			break;
		case 4: //div
			break;
		default:
			break;
		}

		pc++;
	}

	return 0;
}

 

위 코드는 instructions 배열 안에 있는 값에 따라 switch - case로 분기를 해 함수를 실행하는 구조문이다.

 

instructions 배열 안에 값이 1일 경우, add를 호출해 빠르게 처리할 수 있지만

만약 항목이 더 많아져서 배열안의 값이 1000일 경우 ( 물론 지금은 default로 처리 되지만 )

1000까지 비교해가면서 함수를 실행해야하기 때문에 속도가 느려진다.

 

이때 함수포인터 배열을 활용해 구조를 바꾸면 보다 빠르게 함수를 실행할 수 있어진다.

 

#include<stdio.h>

typedef struct MyParams {
	int param1;
	int param2;
	int param3;
} MYPARAMS;

int (*g_op_list[5])(MYPARAMS*); // 함수 포인터 배열

int add(MYPARAMS* pParam)
{
	return pParam->param1 + pParam->param2 + pParam->param3;
}

int sub(MYPARAMS* pParam)
{
	return pParam->param1 - pParam->param2 - pParam->param3;
}

int mul(MYPARAMS* pParam)
{
	return pParam->param1 * pParam->param2 * pParam->param3;
}

int div(MYPARAMS* pParam)
{
	return pParam->param1 / pParam->param2 / pParam->param3;
}

void init_op_list(void)
{
	g_op_list[1] = add;
	g_op_list[2] = sub;
	g_op_list[3] = mul;
	g_op_list[4] = div;
}

int main(void)
{
	init_op_list();
	int instructions[1024] = { 0 };
	int pc = 0;

	MYPARAMS param = { 0 };

	while (instructions[pc])
	{
		g_op_list[instructions[pc]](&param);

		pc++;
	}

	return 0;
}

 

위 처럼 switch - case 구문을 삭제하고 g_op_list 함수 포인터 배열을 활용해 직접적으로 해당 함수를 빠르게 호출해 줄 수 있다.

+ Recent posts