한국어
C/C++
 

C switch와 if 중 어느 것이 더 빠른가

makersweb 2017.01.31 00:47 조회 수 : 3779

switch와 if 을 비교해보고 적절하게 사용하는 방법을 알아보자.

 

#include <stdio.h>

int main(void)
{
int a, b, c, d, x = 0;
int result;

a = b = 3;
c = 5;
d = 6;
result = (a * c) + b / d;

if(result == 0)
x = result + 5;
else if(result == 1)
x = result + 10;
else if(result == 2)
x = result + 15;
else if(result == 3)
x = result + 20;
else if(result == 4)
x = result + 25;
else if(result == 5)
x = result + 30;
else
x = 0;

printf("%dn", x);

return 0;
}

 

if문을 역어셈블로 살펴보면 다음의 그림 처럼 else if 마다 비교 연산을 수행하고있다.

ifelseif.png

 

위의 예제 코드를 switch 문으로 표현한 것이다. 

 

#include <stdio.h>

int main(void)
{
int a, b, c, d, x = 0;
int result;

a = b = 3;
c = 5;
d = 6;
result = (a * c) + b / d;

switch(result)
{
case 0:
x = result + 5;
break;
case 1:
x = result + 10;
break;
case 2:
x = result + 15;
break;
case 3:
x = result + 20;
break;
case 4:
x = result + 25;
break;
case 5:
x = result + 30;
break;
default:
x = 0;
break;
}

printf("%dn", x);

return 0;
}

 

다음의 역어셈에서와 같이 최초 5보다 크면 default레이블로 분기되고 그렇지 않으면 result의 값에 따라 지정된 레이블로 점프됨을 알 수 있다.

switch.png

 

인용 및 참고문헌: 임베디드 프로그래밍 c코드 최적화

번호 제목 글쓴이 날짜 조회 수
공지 C Programming FAQs(한글번역 pdf문서) makersweb 2014.03.18 27654
22 비트 필드의 크기는 해당 유형의 크기를 초과할 수 없다. makersweb 2023.04.25 1342
21 flexible array member 에 대해서 file makersweb 2020.02.20 2852
20 C++로 플러그인 개발 file makersweb 2019.12.08 2699
19 배열과 포인터, 등가포인터 예제 makersweb 2019.01.16 1956
18 싱글톤 객체생성 패턴에 대해서 file makersweb 2018.07.01 4500
17 함수포인터와 typedef로의 선언 makersweb 2018.02.03 1974
» switch와 if 중 어느 것이 더 빠른가 file makersweb 2017.01.31 3779
15 구조체 배열을 반환하는 함수를 반환하는 함수를 호출하여 구조체 멤버 배열 요소 접근하기 makersweb 2016.05.22 10823
14 c/c++문자열, 유니코드 관련 함수 makersweb 2015.07.09 6185
13 volatile이 정확히 어떤 의미를 가지는 건가요? pjk 2014.09.30 5458
12 HEX(16진수) to ASCII(아스키) 변환 코드 pjk 2014.08.24 34933
11 strcmp, wcscmp, _tcscmp pjk 2014.07.18 11426
10 클래스 멤버에 대한 액세스 제어 pjk 2014.06.27 5504
9 unsigned형의 모든 상수에는 접미사 ‘U’를 사용하여야 한다. file pjk 2014.05.24 38730
8 void형 포인터 pjk 2014.05.24 6051
7 함수 포인터의 배열 pjk 2014.05.24 8636
6 구조체 메모리 저장방식 #pragma pack file pjk 2014.05.24 5899
5 Bit fields(비트필드) pjk 2014.05.24 4833
4 예제소스를 통해 리틀엔디안(Little endian)과 빅엔디안(Big endian)의 차이점 알아보기 pjk 2014.05.24 8653
3 영어를 C언어로, 또는 C언어를 영어로 변환 해주는 cdecl makersweb 2014.03.19 8556