오늘 선배의 프로그램을 보고 프로토콜 메시지 유형을 분석하기 위해 if ... 인터럽트 함수의 else 문을 사용했습니다. 현재는 두 가지 유형의 소식만 있기 때문에, 미래는 증가할 수 있다, 확실하지 않다.
나는 이것이 좀 적합하지 않다고 생각하는데, 왜 switch 문을 사용하지 않는가? 추측은 효율성의 고려에서 나온 것이다. 결국, 인터럽트 처리 코드를 더욱 간결하게 하고 시간 효율을 높여야 한다.
그래서 관련 자료를 조사해 보니 switch 문이 ifelse 보다 더 효율적이라는 것을 알 수 있었다.
다음은 switch 와 ifelse 의 차이점에 대해 자세히 설명합니다.
전환 ... 상황
If 와의 근본적인 차이 ... 그렇지 않으면 스위치 ... case 는 switch 의 인덱스 번호와 동일한 인덱스 번호를 가진 실제 case 분기의 주소를 나타내는 점프 테이블을 생성합니다.
변수 값이 같다. 따라서 스위치 ... case 는 if 와 같은 조건이 발생할 때까지 조건부 분기를 통과할 필요가 없습니다. 그렇지 않으면 색인 번호에 해당하는 테이블 항목에 액세스하기만 하면 위치 지정 분기에 도달할 수 있습니다.
분기의 목적.
특히 스위치 ... case 는 최대 case 상수+1 에 대한 skip 테이블을 생성합니다. 프로그램은 먼저 switch 변수가 보다 큰지 여부를 결정합니다.
최대 사례
상수, 보다 크면 처리를 위해 기본 분기로 건너뜁니다. 그렇지 않으면 인덱스 번호가 switch 변수 크기인 점프 테이블 항목의 주소 (즉, 점프 테이블의 시작 주소+테이블 항목의 크기 * 인덱스 번호) 를 가져온 다음 프로그램이 점프합니다.
이 주소에서 실행하면 분기 점프가 여기서 완료됩니다.
//
Int main ()
{
부호 없는 int I, j;
I = 3;;
스위치 (1)
{
시나리오 0:
J = 0;;
깨뜨리다
사례 1:
J =1;
깨뜨리다
사례 2:
J = 2;;
깨뜨리다
사례 3:
J = 3;;
깨뜨리다
시나리오 4:
J = 4;;
깨뜨리다
기본값:
J =10;
깨뜨리다
}
}
Gcc 컴파일러를 사용하여 어셈블리 코드 생성 (컴파일러 최적화 없음)
。 파일 shiyan.c
。 텍스트
。 글로벌 관리자
。 Main, @function 을 입력합니다
주요 사항:
레벨 4 (%esp), %ecx
그리고 1 달러-16%, esp
Pushl -4(%ecx)
Pushl %ebp
운동 비율 esp, %ebp
Pushl %ecx
하위 $20, %esp
Movl $3, -8(% 예산 외)
Cmpl $4, -8(%ebp)
Ja .L2
Movl -8(%ebp), %eax
모두 2 달러, %eax
Movl .L8(%eax), %eax
Jmp *%eax
。 부분. 로다타
。 정렬 4
。 정렬 4
. L8:
。 긴. L3
。 Long .L4
。 긴. L5
。 긴. L6
。 Long .L7
。 텍스트
. L3:
Movl $0,-12(%ebp)
Jmp .L 1 1
. L4:
Movl $ 1,-12(%ebp)
Jmp .L 1 1
. L5:
Movl $2,-12(%ebp)
Jmp .L 1 1
. L6:
Movl $3,-12(%ebp)
Jmp .L 1 1
. L7:
Movl $4,-12(%ebp)
Jmp .L 1 1
. L2:
Movl $ 10,-12(%ebp)
. L 1 1:
20 달러 추가, %esp
Popl %ecx
Popl %ebp
Leal -4(%ecx), %esp
물에 담그면 부드러워진다
。 주요 사이즈. -주인님
。 "gcc: (Ubuntu 4.3.3-5 Ubuntu 4) 4.3.3"
。 Section .note.GNU-stack, "",@progbits
이런 관점에서 볼 때, switch 는 약간의 공간을 가지고 시간을 바꾼다. 사실 역시 그렇다.
1. 분기가 많을 때 switch 를 사용하는 것이 효율적이었다. Switch 는 임의로 액세스되기 때문에 선택 값을 결정한 후 특정 분기로 바로 이동합니다. 。 그렇지 않으면 조건을 만족하는 분기를 찾을 때까지 가능한 모든 값을 순회합니다. 이런 관점에서 볼 때, switch 의 효율성은 확실히 ifelse 보다 훨씬 높다.
2. 위의 어셈블리 코드에서 알 수 있듯이 스위치 ... case 는 점프 테이블을 생성해야 하기 때문에 더 많은 코드 공간을 사용합니다. 특히 case 상수 분포 범위가 넓지만 실제 유효 값이 적을 경우 스위치의 공간 활용도가 낮아집니다 ... 상황이 매우 낮아집니다.
3. 스위치 ... 상황
우리는 상수의 상황만 처리할 수 있고, 비상수의 상황에는 아무것도 할 수 없다. 예를 들어, (a >;; 1. & AMPA & lt
100), 스위치를 사용할 수 없습니다 ... 처리할 사건. 따라서 상수에서 분기를 선택할 때 switch 는 ifelse 보다 더 효과적일 수 있지만 ifelse 는 더 많이 적용될 수 있습니다
Ifelse 는 많은 경우에 더 유연합니다.
이러한 관점에서 볼 때, 위 선배들의 인터럽트 처리기에서 switch 를 사용하는 것이 적당하므로 시간을 절약하고 향후 프로그램 확장을 용이하게 할 수 있습니다. 메시지 유형의 값은 기본적으로 정수 상수로 표현되기 때문입니다.