게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
함수포인터 질문이요!
게시물ID : programmer_5473짧은주소 복사하기
작성자 : 색시몽리턴즈
추천 : 0
조회수 : 1106회
댓글수 : 11개
등록시간 : 2014/09/16 22:57:07


코딩하는 방법에 대한 것은 아니구요.


자료구조 관점에서 함수포인터를 이용한 함수호출과

그냥 함수호출과의 수행시간에 대해서 질문합니다.


제가 생각하기에는 함수포인터는 포인터 변수에 저장된

주소를 이용하여 한번 더 찾아가는 방식이므로,

보통의 함수 호출보다 수행 시간이 더 오래 걸릴 것으로 예상됩니다.


현업에서 수행시간에 민감한 부분이라 그렇습니다만,

간단히 설명하면 아래와 같은 상황입니다.



<리눅스 드라이버 코드>

////////////////////////////////////////////

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 문을 생략한 방법이므로 분기문의 수행시간이 필요하지 않습니다.

파이프라인에서도 실행 시간에 가장 취약하다는 분기문을 생략한 것이므로,

함수포인터를 이용하는게 수행 시간이 더 빠르지 않을까 생각합니다.


구글에서 관련 자료를 찾아보았는데, 대부분 함수포인터 사용법에 대해서만 나오고

자료구조 관점에서 설명한 것은 찾기가 어렵네요. (자료 검색 능력이 떨어지는 것일 수도..)


혹시 관련 지식을 알고 계신분 계신가요?



전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호