3 回答

TA貢獻1835條經驗 獲得超7個贊
甲開關構建體更容易地轉換成一個跳躍(或分支)表。當案例標簽靠在一起時,這可使switch語句比if-else效率更高。這個想法是將一堆跳轉指令順序地放在內存中,然后將其值添加到程序計數器中。這將一系列比較指令替換為加法運算。
以下是一些極為簡化的偽裝配件示例。首先,if-else版本:
// C version
if (1 == value)
function1();
else if (2 == value)
function2();
else if (3 == value)
function3();
// assembly version
compare value, 1
jump if zero label1
compare value, 2
jump if zero label2
compare value, 3
jump if zero label3
label1:
call function1
label2:
call function2
label3:
call function3
接下來是交換機版本:
// C version
switch (value) {
case 1: function1(); break;
case 2: function2(); break;
case 3: function3(); break;
}
// assembly version
add program_counter, value
call function1
call function2
call function3
您可以看到生成的匯編代碼更加緊湊。請注意,需要以某種方式轉換該值以處理除1、2和3以外的其他值。但是,這應該可以說明該概念。

TA貢獻1820條經驗 獲得超3個贊
我忽略了通常不重要的這種低級優化類型,并且可能因編譯器而異。
我想說的主要區別是可讀性。if / else非常靈活,但是當您看到一個開關時,您立即知道所有測試都針對同一個表達式。

TA貢獻1810條經驗 獲得超4個贊
為了表現力,switch / case語句允許您將多個案例組合在一起,例如:
case 1,2,3: do(this); break;
case 4,5,6: do(that); break;
為了提高性能,編譯器有時可以將switch語句優化為跳轉表。
- 3 回答
- 0 關注
- 1096 瀏覽
添加回答
舉報