C/C++에선 고속 스위칭을 하기 위해 swtich-case 구문의 값에는 정수(int, long등)만을 받게 되어있습니다. 그 이유중에 하나가 address jump를 하기 위해서죠. 그래서 보통 C/C++에서 switch-case문은 빠르다고 알고 있습니다. 하지만 반드시 address jump를 하는건 아닙니다. 그리고, 몇몇 분들은 분기(if-then)을 하기 때문에 if 구문보다 빠르지 않다고 하기도 합니다. 그 조건은 다음과 같습니다.
위에 설명한 조건은 VC++ 6.0 / 7.0에서 동작한다고 하며, 저도 VC++.NET 8.0의 디에셈블을 통해서 확인해봤습니다. 정말 저대로 동작하더군요. ^^;예>
- case가 3개 이하인 경우에는 if/else로 일일히 비교후 분기 한다.
- case가 4개 이상이고, 최소 case와 최대 case의 차이가 254 이하인 경우에는 address table을 만들어 jump 한다.(이 과정에서 최대 약 1KB의 address table이 생성된다. switch를 잘못 쓰면 1KB의 디스크 공간과 메모리를 낭비할 수도 있다.)
- 최소 case와 최대 case의 차이가 255 이상인 경우에는 if/else로 비교후 분기한다. 단, 최소 case를 포함하며 규칙2의 조건을 만족하는 부분집합이 존재할 경우 해당 case들은 address table을 만들어 jump 한다.
case 0, 1, 2 -> if/else로 분기 (규칙 1)
case 0, 1, 2, 3, 4 -> address table로 분기 (규칙2)
case 0, 1, 2, 3, 4, 100 -> address table로 분기 (규칙 2)
case 0, 1, 2, 3, 4, 100, 300 -> 0~100 까지는 address table로 분기.
300은 if/else로 분기(규칙3)
case 0, 300, 301, 302, 303, 304 -> 모두 if/else로 분기 (규칙3)
위의 내용은 제가 속한 CUG에서 퍼온 내용입니다.
어쩔 수 없이 차이가 255 이상되는 값을 사용해야 한다면 값을 슬라이싱하여 사용할 수도 있습니다. 극단적으로 빠른 처리가 필요한 경우에는 말이죠.
요즘은 CPU의 성능이 좋아져서 저 조건은 무시해도 될 정도이긴 하지만, 알고 무시하는 것과 모르고 무시하는 것은 하늘과 땅 차이가 있다고 생각합니다. :)



댓글을 달아 주세요
좋은 글 보고 갑니다. 공개해 주셔서 감사합니다.
organic colors http://liudehua.tumblr.com/ the designers
(brown and sand) http://sawan25.weebly.com/ provide the
or you might be http://yoonenn.blogspot.com/ in-vogue choice
somewhat http://nierwe6.fotopages.com from the Moncler
significantly http://ueoroe.webs.com/ st From 1952 to