C++中一道關(guān)于 代碼優(yōu)化--死代碼 的選擇題解析
程序的完整編譯過程分為是:預(yù)處理,編譯,匯編等,如下關(guān)于編譯階段的編譯優(yōu)化的說法中不正確的是()
A、死代碼刪除指的是編譯過程直接拋棄掉被注釋的代碼;
B、函數(shù)內(nèi)聯(lián)可以避免函數(shù)調(diào)用中壓棧和退棧的開銷
C、For循環(huán)的循環(huán)控制變量通常很適合調(diào)度到寄存器訪問
D、強(qiáng)度削弱是指執(zhí)行時間較短的指令等價的替代執(zhí)行時間較長的指令
A.??? 了解編譯原理的同學(xué)都清楚, 死代碼主要是指1. 執(zhí)行不到的代碼. 2. 執(zhí)行得到, 但沒有任何作用的代碼。 總而言之一句話: 死代碼就是“不產(chǎn)生實際作用”的代碼(而不是上面A選項說的那樣的)。 舉個例子:
#includeusing?namespace?std; int?main() { int?a?=?1;?????//?死代碼 int?b?=?2; cout?<<?b?<<?endl; //?死代碼 if(0) { cout?<<?"hello?world"?<<?endl; } //?死代碼 #if?0 cout?<<?"hello?world"?<<?endl; #endif return?0; cout?<<?"hello?world"?<<?endl;? //?死代碼 }
B.? C++中的inline函數(shù), 在當(dāng)?shù)卣归_。 C/C++中的宏也是展開。 都沒有什么調(diào)用壓棧的過程。不過inline和宏又是有差別的, inline在運行時可調(diào)式, 宏則死板展開。 而且宏會有邊際副作用, 不好。 總之, inline既高效, 又安全。 為什么呢? 咱吃點小菜就明白了:
#includeusing?namespace?std;? ?? //?比較宏和inline?? #define?SQU(x)?((x)?*?(x))???? ? inline?int?squ(int?x)? {?? ????return?x?*?x;?? }?? ?? int?main()?? {?? int?a?=?3;?? cout?<<?SQU(++a)?<<?endl;?//?25??? int?b?=?3;?? cout?<<?squ(++b)?<<?endl;?//?16?? return?0;?? }
C.? 我們知道, cpu要內(nèi)存中取i需要一定的時間, 還不如直接在自己身體中的寄存器中取。 實際上, 很多編譯器默認(rèn)做了此類優(yōu)化, 所以下面的代碼在實際開發(fā)中并不常見。
#includeusing?namespace?std;? ? int?main()? {? ????register?int?i?=?0;? ????for(i?=?0;?i?<?100;?i++)? ????{? ????????cout?<<?i?<<?endl;? ????}? ? ????return?0;? }
D.? 強(qiáng)度削弱,很好理解, 就是不讓強(qiáng)度那么大, 說白了, 就是用執(zhí)行時間較短的操作(指令)去代替一個耗時操作, 如:
#includeusing?namespace?std;? ? int?main()? {???? ????int?a1?=?5;? ????int?b1?=?17;? ????int?c1?=?a1?*?b1;? ????cout?<<?c1?<<?endl;? ? ? ????//?強(qiáng)度削弱? ????int?a2?=?5;? ????int?b2?=?a2?<<?4;? ????int?c2?=?a2?+?b2;? ????cout?<<?c2?<<?endl;? ? ????return?0;? }
再如:
#includeusing?namespace?std;? ? int?main()? {???? ????int?a1?=?24933;? ????int?b1?=?128;? ????int?c1?=?a1?%?b1;? ????cout?<<?c1?<<?endl;? ? ? ? ????//?強(qiáng)度削弱? ????int?a2?=?24933;? ????int?b2?=?128;?????//容易證明?x%(2^n)?=?x&(2^n?-?1),??其中^乘方? ????int?c2?=?a2?&?127;? ????cout?<<?c2?<<?endl;? ? ????return?0;? }