編譯器優化
① 編譯器優化怎麼定義
常見的優化和變新有:函數內嵌(inlining),無用代碼刪除(Dead code elimination),標准化循環結構(loop normalization),循環體展開(loop unrolling),循環體合並,分裂(loop fusion,loop fission),數組填充(array padding),等等。 優化和變形的目的是減少代碼的長度,提高內存(memory),緩存(cache)的使用率,減少讀寫磁碟,訪問網路數據的頻率。更高級的優化甚至可以把序列化的代碼(serial code)變成並行運算,多線程的代碼(parallelized,multi-threaded code)。
機器代碼的生成是優化變型後的中間代碼轉換成機器指令的過程。現代編譯器主要採用生成匯編代碼(assembly code)策略,而不直接生成二進制的目標代碼(binary object code)。即使在代碼生成階段,高級編譯器仍然要做很多分析,優化,變形工作。例如如何分配寄存器(register allocatioin),如何選擇合適的機器指令,如何合並幾句代碼成一句等等。
② 編譯器的優化到底能夠優化到什麼程度
在不改變程序行為的前提下可以任意改寫代碼
③ 編譯器的編譯器優化
應用程序之所以復雜, 是由於它們具有處理多種問題以及相關數據集的能力。實際上, 一個復雜的應用程序就象許多不同功能的應用程序「 粘貼」 在一起。源文件中大部分復雜性來自於處理初始化和問題設置代碼。這些文件雖然通常占源文件的很大一部分, 具有很大難度, 但基本上不花費C PU 執行周期。
盡管存在上述情況, 大多數Makefile文件只有一套編譯器選項來編譯項目中所有的文件。因此, 標準的優化方法只是簡單地提升優化選項的強度, 一般從O 2 到O 3。這樣一來, 就需要投人大量 精力來調試, 以確定哪些文件不能被優化, 並為這些文件建立特殊的make規則。
一個更簡單但更有效的方法是通過一個性能分析器, 來運行最初的代碼, 為那些佔用了85 一95 % CPU 的源文件生成一個列表。通常情況下, 這些文件大約只佔所有文件的1%。如果開發人員立刻為每一個列表中的文件建立其各自的規則, 則會處於更靈活有效的位置。這樣一來改變優化只會引起一小部分文件被重新編譯。進而,由於時間不會浪費在優化不費時的函數上, 重編譯全部文件將會大大地加快。
④ Debug模式下怎樣去掉編譯器的優化解決思路
通常開發的程序有2種模式:Debug模式和Release模式。
在Debug模式下,編譯器會記錄很多調試信息,也可以加入很多測試代碼,方便程序員測試,以及出現bug時的分析解決。
Release模式下,就沒有上述那些調試信息,而且編譯器也會自動優化一些代碼,這樣生成的程序性能是最優的,但是如果出現問題,就不方便分析測試了。
⑤ 編譯器 優化
編譯是從源代碼(通常為高階語言)到能直接被計算機或虛擬機執行的目標代碼(通常為低階語言或機器語言)的翻譯過程。然而,也存在從低階語言到高階語言的編譯器,這類編譯器中用來從由高階語言生成的低階語言代碼重新生成高階語言代碼的又被叫做反編譯器。也有從一種高階語言生成另一種高階語言的編譯器,或者生成一種需要進一步處理的的中間代碼的編譯器(又叫級聯)。
典型的編譯器輸出是由包含入口點的名字和地址, 以及外部調用(到不在這個目標文件中的函數調用)的機器代碼所組成的目標文件。一組目標文件,不必是同一編譯器產生,但使用的編譯器必需採用同樣的輸出格式,可以鏈接在一起並生成可以由用戶直接執行的可執行程序。
從他的原理我們就好優化了,但是方法很多的
⑥ 被編譯器優化掉 是什麼意思
沒聽說過,難道是注釋和空行之類的,在源代碼被編譯成exe程序時,直接被去掉了,被稱為優化掉?
⑦ 如何防止因編譯器開啟優化,而導致程序執行錯誤
我的經驗是:未優化的c程序可正常運行,優化後不能運行,那一定是我的程序有問題。我還沒經歷過不是我程序的情況。
發現這種不易發現的問題,需要看匯編碼。
避免的方法,我的經驗:寫c程序,盡量規矩;似是而非的概念,一定要搞清楚,別僥幸。因為僥幸而留的雷,現在不出問題,將來一定會出問題;不優化不出問題,優化就出問題。
最後要說,每個應用程序,都讓他開優化運行,只要時間允許,一定要查出開優化後出問題的原因。時間不允許,只能不開優化湊合著,在有時間的時候繼續查問題。
⑧ Dev C++ 編譯器選項中的優化級別哪個對應不優化
ide沒有優化的功能吧,只有編譯器才有,mplab只是環境而以,而編譯器是picc或c18啊,他們才有優化的本事
⑨ 如何在編譯java的時候,取消編譯器對編譯常量的優化
遇到的問題是想重新編譯某個java文件(比如A.java),裡面有個常量(比如finalinta)和上次編譯時不一樣,但是另一個使用A.class的a的文件(比如B.java)由於在javac在上次編譯的時候將當時的A.class裡面的常量直接給內聯了,所以就達不到想要的效果。
如果是這樣的話,對於String可以使用.intern()來防止編譯器進行優化,對於其他類型,可以要麼不定義為常量,要麼將常量定義為private,然後使用一個static方法來返回這個常量。
⑩ 這是VS2010編譯器優化嗎怎麼改
這個問題比較深, 所以只有哥來回答你了。
你說的問題在VS2008上也是相同的表現,這個是因為微軟的庫實現不是直接實現在你call的generate_n這個函數上的,而是有好幾重轉調,所以造成你即使對第一重調用的 模板函數用 引用去實例化,由於後面轉調的函數都是使用值去實例化的,所以實際你得到的運行效果還是值語義的。
比如你call 函數 func1<A&>(), 但是由於func1<A&>() 調用了func2<A>(), 又繼續調用了func3<A>(), 最後func3里操作的其實是一個值拷貝,所以影響不到外面的引用的對象。
哥去 微軟報了個bug,裡面寫得比較細,你可以仔細看,http://connect.microsoft.com/VisualStudio/feedback/details/676282/vs-2010-sp1-doesnt-conform-to-the-c-standard-library-a-tutorial-and-reference