간단한 에뮬레이터를 작성 중이며 (해야합니까? 아니면 다시 C로 가야합니까?). 어쨌든 , 나는 명령을 가져오고 그것을 해독 중입니다. 이 시점에서 나는 0x81과 같은 바이트를 가지고 있고, 나는 올바른 함수를 실행해야한다.함수 표와 golang 스위치
내가 이런이
func (sys *cpu) eval() {
switch opcode {
case 0x80:
sys.add(sys.b)
case 0x81:
sys.add(sys.c)
etc
}
}
이나 뭐 같은 것을
var fnTable = []func(*cpu) {
0x80: func(sys *cpu) {
sys.add(sys.b)
},
0x81: func(sys *cpu) {
sys.add(sys.c)
}
}
func (sys *cpu) eval() {
return fnTable[opcode](sys)
}
1.which 하나가 낫다해야합니까?
2. 어느 것이 더 빠릅니까?
3. 함수를 인라인으로 선언 할 수 있습니까?
4.i에는 레지스터가있는 cpu
struct
이 있습니다. 레지스터가 있고 전역 변수가 있으면 더 빠릅니까? (struct
제외)
대단히 감사합니다.
만약 컴파일러가 이런 식으로 점프 테이블을 만들지 않았다면 놀라실 것입니다. 특히'opcode'가 바이트 인 경우에 말이죠. 나는 당신의 벤치 마크 결과를보고 싶다. –
다음 질문에 대한 메모 : 귀하의 질문 4는 귀하의 * 일반적인 질문에 대한 주제가 아닙니다. IMO는 질문에 일반적인 질문/주제의 측면에 대한 몇 가지 질문을 포함 할 수 있지만, 주제와는 다른 질문은 별도의 질문으로 요청해야합니다. – Kissaki
의심스러운 경우 어셈블리 출력을 확인하십시오. –