코딩하는 방법에 대한 것은 아니구요.
자료구조 관점에서 함수포인터를 이용한 함수호출과
그냥 함수호출과의 수행시간에 대해서 질문합니다.
제가 생각하기에는 함수포인터는 포인터 변수에 저장된
주소를 이용하여 한번 더 찾아가는 방식이므로,
보통의 함수 호출보다 수행 시간이 더 오래 걸릴 것으로 예상됩니다.
현업에서 수행시간에 민감한 부분이라 그렇습니다만,
간단히 설명하면 아래와 같은 상황입니다.
<리눅스 드라이버 코드>
////////////////////////////////////////////
static int flag = 0;
void func(void)
{
if (flag)
true_func();
else
false_func();
}
EXPORT_SYMBOL(func);
void config_func(void)
{
flag = 1;
}
EXPORT_SYMBOL(config_func);
///////////////////////////////////////////
위의 코드가 아닌 다른 드라이버 코드에서 위의 func()을 계속 호출합니다.
처음엔 flag의 초기값으로 인해 false_func()이 계속 호출됩니다.
그러다 임의로 config_func()을 호출하게 되면,
이 후로는 true_func()이 호출 되는 방법입니다.
위와 같은 경우 func()을 호출 했을 때 true이든 false이든 무조건
if문을 수행해야 하는 구조입니다.
아래의 코드는 함수포인터를 사용했을 경우입니다.
////////////////////////////////////////////
void (*func)(void) = false_func;
EXPORT_SYMBOL(func);
void config_func(void)
{
func = true_func;
}
EXPORT_SYMBOL(config_func);
///////////////////////////////////////////
위의 코드에서도 마찬가지로 외부에서 func()을 계속 호출합니다.
함수포인터의 초기 값은 false_func()의 주소로 맵핑되어 있습니다.
그리고 마찬가지로 임의로 config_func()을 호출한 이후부터는 true_func()이 호출될 것입니다.
위의 경우 if 문을 생략한 방법이므로 분기문의 수행시간이 필요하지 않습니다.
파이프라인에서도 실행 시간에 가장 취약하다는 분기문을 생략한 것이므로,
함수포인터를 이용하는게 수행 시간이 더 빠르지 않을까 생각합니다.
구글에서 관련 자료를 찾아보았는데, 대부분 함수포인터 사용법에 대해서만 나오고
자료구조 관점에서 설명한 것은 찾기가 어렵네요. (자료 검색 능력이 떨어지는 것일 수도..)
혹시 관련 지식을 알고 계신분 계신가요?