热门问题
时间线
聊天
视角
死程式碼
在执行一个程序的源代码,但其结果是从未使用过任何其他计算。死代码的执行浪费计算时间和内存 来自维基百科,自由的百科全书
Remove ads
死程式碼(dead code)有幾種不同的定義。有一種定義是指程式運行時永遠不會執行到的程式碼(記憶體裏的指令)[1][2][3]。在一些程序設計的領域中,死程式碼是指原始碼中有執行,但其他程式沒有使用該執行結果的程式[4][5]。死程式碼會浪費記憶體,若是有執行的死程式碼,還會浪費執行時間。
死程式碼的結果雖然不會被其他程式使用,但程式碼可能會拋出異常或是影響全域變數,因此移除死程式碼有可能會影響程式輸出並引入未預期的程序錯誤。編譯器在進行死碼刪除時,若某程式不確定是否會影響最後輸出,編譯器最佳化會比較保守。程式設計者也可以幫助編譯器,利用靜態函式、內聯函數,並且啟動連結時最佳化。
範例
int foo (int iX, int iY)
{
int iZ = iX/iY;
return iX*iY;
}
在上述例子中,儘管計算了iX除以iY的結果,但其從未被使用,並且當iY等於0時程序會拋出異常。因此移除這段代碼可能會改變程序的輸出。
分析
死碼刪除是優化編譯器中的功能,刪除程式中的死碼。死碼分析可以用活躍變數分析來進行,這屬於靜態程序分析和數據流分析。而不可達程式碼分析是另一種分析,是以控制流分析為基礎。
死碼刪除技術和不可達程式碼刪除和冗餘代碼刪除是同一類的最佳化。
在大型程式專案中,有時很不容易識別並且刪除死程式碼,特別是在整個模組都是死代碼的情形下。測試腳手架(Test scaffolding)有可能會讓程式碼看起來仍存活,有時契約語言會要求交付一些已不相關的程式碼[6]。
有些IDE(像Xcode、Visual Studio 2010[7]和Eclipse Galileo[8])可以在編譯過程中找出死程式碼。
大部份的最佳化技術是希望在程式實現時移除死程式碼,但在對程式碼大小有極致要求的最佳化中,有時會刻意引入一些看似無用的程式碼,並且小心的編寫這些程式碼,因為這些程式碼可以將一些無關的程式區塊集中在一起(因此減少其大小),這段額外的程式碼不會影響程式碼的主要執行路徑,而是用於執行其他執行路徑所需的操作,而在其他執行路徑下,會有其他的程式碼段未使用到。可能因此成為無用程式碼。從更具體的功能層面來看,這可以看作是人為地引入無害/有用的副作用,也可以看作是減少程式碼冗餘。此外,這種方法還可以應用到操作碼級別,從而允許使用更短的指令。如果沒有刻意引入由無用程式碼產生的副作用,在合併程式碼序列時是無法實現這一點的。
Remove ads
相關條目
參考資料
外部連結
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads