2012-06-21 4 views
2

빠른 질문입니다. 예를 들어, ~ 1000 가지 옵션 중 몇 가지 더 큰 경우와 함께 작업하십시오. '가장 좋은'방법은 무엇입니까? 나는 특별히 빠른 결과를 얻고 싶지 않습니다.스위치 케이스 설명이 더 큰 경우 분리하는 것이 더 좋습니까?

switch (foo) { 
    case 0: 
     // code ... 
     break; 

    // One, two, skip a few... 

    case 1000: 
     // code ... 
} 

또는 적절한 결과 문구를 신속하게 찾을 수 있도록 가능한 결과가 나뉘는 항목. 유사 너무 :

if (foo < 101) { 
    if (foo < 51) 
     switch (foo) {} 
    else 
     switch (foo) {} 
} else if (foo > 100 && foo < 201) { 

// skipped for convenience 

} else if (foo > 900) { 
    if (foo < 951) 
     switch (foo) {} 
    else 
     switch (foo) {} 
} 

나는 두 번째 방법은 훨씬 더 빨리 더 큰 숫자 상상하지만, 첫 번째 방법은 또한 끊임없이 문을 확인하지이기 때문에 그것을 통해 산들 바람 수있을 것 같다. 이 방법들 중 하나가 눈살을 찌푸 리거나 더 좋은 방법이 있습니까? 이것은 C 언어에 대한 것이지만 다른 언어와의 일관성을 아는 데 관심이 있습니다. 감사!

+4

나는 – Levon

+0

가 하하 네, 정말 1,000가지 경우 근처에 아니에요 .. 이것에 대해 걱정하기 전에 먼저 1000 'case's의 필요성을 검토 것입니다,하지만 난 답을 알고에 매우 관심이 있습니다. 학습에 대한 관심의 힘을 부정 할 수는 없습니다. –

+1

배열에 사례 정수를 저장하고 실행할 대/소문자 코드 블록을 찾기 위해 이진 검색을 수행 할 수 있습니다. – Lalaland

답변

8

switch 문을 매우 빠르게 할 수있다). 두 번째 예에서와 같이 여러 조건을 평가해야 할 나란히 놓이는로 실행,하지만이 cases의 특별한 순서에서만 가능 실제적으로 가능하지 않을 수도 있습니다. 가능한 경우 cases에 달려 있습니다. 컴파일러는 점프 테이블을 사용하거나 사용하지 않을 수도 있습니다.이 점을 발견했습니다. http://blog.jauu.net/2010/06/15/GCC-generated-Switch-Jump-Tables/은 재미있었습니다.

JUMP 테이블은 오프셋을 계산하고 적절한 주소로 점프하기 때문에 엄청나게 빠릅니다.

GCC에는 -fno-jump-tables이있어이를 완전히 비활성화합니다.

때때로 함수 포인터 배열과 특수 인덱스를 사용하여 점프 테이블을 직접 만들 수 있습니다. 이렇게하면 코드가 놀라 울 정도로 빨라지지만 모든 경우에 실용적이지는 않습니다. 스위치가 있다고 상상해보십시오. 함수 포인터를 배열로 만들면 기본 함수를 안전하게 설정 한 다음 스위치 대신에 간단히 수행 할 것입니다 fun_table[indice](); 내 자신의 가상 시스템에 대해 한 번 수행했습니다.

+0

답장과 링크를 보내 주셔서 감사합니다. 너무 재미있었습니다. –

+1

문제는 없지만 컴파일러에 달려 있습니다. 일부는 컴파일러 교수가하지 않을 것입니다.'훌륭한 C 컴파일러가 노력할 것이고, 다른 컴파일러는 단지 다른 언어로 번역 할 것입니다. ' –

+0

GCC를 사용하고 있습니다. 스위치 케이스 진술과 함께 응답자 사이에 동의하는 것 같습니다. –

1

내가 switch 문은 적어도 코드의 가독성 측면에서 더 나은 것을 믿습니다 (그리고 어쩌면 속도의 관점에서 그것은 단지 따기 이후 :

이것은 정확히 증명하지 않지만, 그것을 지원하는 것 한 블록에서 컴파일러는 점프 테이블을 사용하여 구현하는 경우

+0

switch 문은 훨씬 더 읽기 쉽고 큰 이점이 있습니다. 귀하의 회신에 감사드립니다. –

1

어떤 기능도 약 1.5 화면에 맞지 않는 것이 좋습니다. 따라서 거대한 switch 문이이 법안에 맞지 않습니다. 이를 극복하려면 dispatch 테이블이 있어야합니다. 배열에 인덱스를 작성하여 적절한 함수를 호출해야합니다.

+0

정보를 제공해 주셔서 감사합니다. 나는 C에서이 데이터 구조의 사용을 확실히 조사 할 것이다. –

0

samy.vilar는 이미 함수 배열을 사용하여 가장 훌륭한 솔루션을 제공 했으므로 정보 용도로 게시하고 있습니다. GCC를 사용하면 사례 범위를 이해합니다. 이 코드는 결국 두 번째 솔루션과 매우 유사한 방식으로 작동하여 일부 바이너리 트리 코드 경로가 생깁니다 (컴파일러 최적화가 없다고 가정).

int    nested_switch(int i) 
{ 
    switch (i) { 
    /* i is in the 1..10 range */ 
    case 1 .. 10: 
    switch (i) { 
     /* i is in the 0..5 range */ 
    case 1 .. 5: 
     switch (i) { 
     case 1: 
     break; 
     case 2: 
     break; 
     ... 
     case 5: 
     break; 
     } 
    case 5 .. 10: 
     switch (i) { 
     case 6: 
     break; 
     case 7: 
     break; 
     ... 
     case 10: 
     break; 
     } 
    } 
    /* i is in the 11..20 range */ 
    case 11 .. 20: 
    switch (i) { 
     ... 
    } 
    } 

    return 0; 
} 
관련 문제