आगे Jerry's answer पर विस्तार करने के लिए और अन्य लोगों के
को देखते हुए:
int f1() {return 6;}
int f2() {return 1+f3();}
int f3() {return 8;}
संकलक एक कूद तालिका सूचकांक {f1, f2, f3}
लिए इस्तेमाल कर सकते हैं:
int x=1;
switch (i) {
case 1: x=6; break;
case 2: x++;
// Fall through
case 3: x+=7; break;
}
आप निम्नलिखित की तरह कुछ हो सकता था
कंपाइलर कर सकता है इनलाइन करने जब f1, f2, f3
6,9,8
के लिए सीधे x
की स्थापना लेकिन अगर आप कार्यों लिखा था, और अपने खुद के कूद तालिका लुढ़का, f1,f2,f3
कहीं भी हो सकता है, लेकिन संकलक उन्हें switch
ज्यादा बेहतर बनाने के करीब डाल करने के लिए पता चल जाएगा होने तालिका बनाने कोड इलाके से आप कर सकते हैं।
ध्यान दें कि कई मामलों में संकलक अगर i
सीमा में है एक गार्ड की जाँच करने के लिए (या default
को संभालने के लिए) उत्पन्न होगा और यदि आप यकीन है कि यह हमेशा मामलों में से एक है कर रहे हैं, तो आप छोड़ सकते हैं कि
if (i==1) x=f1();
else if (i==2) x=f2();
else if (i==3) x=f3();
या यह हो सकता है:
दिलचस्प बात यह है कि मामलों की एक छोटी संख्या के तहत, और अलग संकलक झंडे के नीचे (संकलक निर्भर) के लिए switch
एक मेज का प्रयोग करेंगे नहीं, लेकिन सिर्फ भारतीय विदेश सेवा करना होगा, इसी तरह करने के लिए है इसे अनुकूलित करें (जहां सरल परीक्षण एक निर्देश हैं):
x=(i==1) ? f1()
: (i==2) ? f2()
: (i==3) ? f3()
: x;
सबसे अच्छा सलाह क्या संकलक अपने वास्तुकला पर अपने कोड के लिए क्या किया देखने के लिए उत्पन्न विधानसभा को देखने के लिए, जी ++ पर लिनक्स/इंटेल, निम्नलिखित की तरह कुछ उत्पन्न होगा अगर वहाँ एक कूद तालिका
है
ध्यान दें कि छोटे छेद कूद तालिका में होगा default
करने के लिए (
टिप्पणी मैं 5 case
बयान करने के लिए जाने के लिए कूद तालिका के लिए मजबूर करने के लिए किया था, यह भारतीय विदेश सेवा case
बयान की संख्या नीचे प्रयोग किया जाता)
int foo(int i)
{
int x=1;
switch (i) {
case 1: x=6; break;
case 2: x++;
// Fall through
case 3: x+=7; break;
case 4: x+=2; break;
case 5: x+=9; break;
}
return x;
}
निम्नलिखित विधानसभा कोड उत्पन्न होगा (// टिप्पणी मेरा हैं):
cmp edi, 5 //make sure it is not over 5
ja .L2 //jump to default case
mov edi, edi
jmp [QWORD PTR .L4[0+rdi*8]] // use the jump table at label L4:
.L4:
.quad .L2 // if i=0, set x=1 (default)
.quad .L9 // f1() see below
.quad .L10 // f2() see below
.quad .L6 // f3() see below
.quad .L7 // f4() see below
.quad .L8 // f5() see below
.L10:
mov eax, 9 // x=9
ret
.L9:
mov eax, 6 // x=6
ret
.L8:
mov eax, 10 // x=10
ret
.L6:
mov eax, 8 // x=8
ret
.L7:
mov eax, 3 // x=3
ret
.L2:
mov eax, 1 // default, x was 1, noop is: x=1
ret
आमतौर पर एक "शब्दकोश" एक हैशटेबल जैसा ही होता है। –