avoiding Switch-Case Statement overhead: using Function Pointer

 

출처: https://cafe.daum.net/coders/KfIi/72

case가 많아져 if문 대신 switch-case문을 쓰게되면 내심 jump table의 오버헤드가 부담스러워졌었다. 그러다 어느날 switch-case 문을 회피하고도 비슷한 효과를 낼 수 있는 방법을 다룬 글을 보고 메모해둬야겠다고 생각하면서 글을 쓰기 시작했다.

근데 막상 더 찾아보니 [StackOverflow] [GameDev] 별로 도움이 되는 것 같지 않기도 하고… 컴파일러 최적화나 case의 개수, 분포 등에 따라 결과가 달라지니 직접 해당 케이스에 대해 시도해보고 비교해보라는 조언이 많았다. 그도 그럴 것이 사실 jump table 오버헤드보다 더한게 함수 오버헤드인데… 게다가 많은 컴파일러들이 이미 switch-case를 고인물급 최적화시켜 놓았다.

어쨌든, 어찌보면 간단한 기법인데 한번도 이럴 생각을 해보지 못했다. C언어를 처음 배울땐, 포인터는 어디다 써먹는거야 하며 한 귀로 듣고 흘렸었고, 그 다음 다시 배울땐 포인터의 중요성과 활용은 알았는데 왜 뜬금없이 함수포인터가 있나 했었다. 그래서 남겨볼까 한다.

혹 퍼포먼스 측면에서 불리하더라도, 기억 해두어야겠다. 뭐였는지 기억은 안 나는데, 며칠 전에 switch-case 문으로 분기하여, 각각 case에 맞는 함수를 호출하도록 코드를 짰던 적이 있었다. 단점만 취한다 적어도 앞으로 그렇게는 안하겠지…

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int func0(){ return 0; }
int func1(){ return 1; }
int func2(){ return 2; }

int chooseCase(){
    srand((unsigned int)time(NULL));
    return rand()%3;
}

int main(){
    int result;
    int (*functions[])() = {func0, func1, func2};
    
    result = functions[chooseCase()]();
    return 0;
}

아무 의미없는 예제다. 다음에 switch-case문을 쓸때 case가 많고 각각 case마다 복잡한 코드가 요구되거나 함수로 빼는 경우 적극 활용해 보아야겠다.

This work is licensed under Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.
(The excerpted works are exceptionally subject to a licence from its source.) Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)