常量編譯器優化
⑴ 如何防止因編譯器開啟優化,而導致程序執行錯誤
我的經驗是:未優化的c程序可正常運行,優化後不能運行,那一定是我的程序有問題。我還沒經歷過不是我程序的情況。
發現這種不易發現的問題,需要看匯編碼。
避免的方法,我的經驗:寫c程序,盡量規矩;似是而非的概念,一定要搞清楚,別僥幸。因為僥幸而留的雷,現在不出問題,將來一定會出問題;不優化不出問題,優化就出問題。
最後要說,每個應用程序,都讓他開優化運行,只要時間允許,一定要查出開優化後出問題的原因。時間不允許,只能不開優化湊合著,在有時間的時候繼續查問題。
⑵ 編譯器是怎麼實現32位整型的常量整數除法優化的
int divide(int a, int b) { return a / b; } float divide(float a, float b) { return a / b; }
⑶ 對於一個很復雜的常量表達式,編譯器會算出結果再編譯嗎
這種問題會有幾個維度。挑兩個來說說:
涉及的常量折疊是否為語言規范所強制要求的。如果是的話,那麼符合規范的編譯器就一定要做這樣的常量折疊。
如果不屬於上一條的情況,那麼這就是編譯器的實現質量的問題。一個編譯器可以自由選擇是否做常量折疊(或其它常量相關)優化。同一個編譯器有可能可以配置在不同的優化層級上工作,或許有些在低優化層級沒有被常量折疊的代碼,在高優化層級會被優化。
⑷ 怎麼指定某段代碼不被編譯器優化掉
在C語言中, 某些語句,如:
int a;
a = 0;
a = 1;
a =2; 這個可能編譯器會把前面兩句給優惠掉, 這個如果 前面兩句也是必須要執行的, 可以把 int a 改成 volatile int a。
在編譯的時候, 編譯器可能會預測到某個變數的值, 就把中間的沒有必要的語句給優化掉,volatile 關鍵字就是告訴編譯器,不要做這樣的預測性優化, 按照文本代碼來翻譯。
⑸ java中 String s = "aa" + "bb" 創建了幾個對象
標准答案 只建立一個對象 !
String s ="aa"+"bb",
在編譯時候進行了優化處理。變成 String s ="aabb"; 這個和java 本身沒關系。這是編譯優化原理,
編譯器對常量運算,會進行優化。
分析一下.class 文件就知道了。
如果是這樣情況就不一樣了!
String s1="aa";
String s2="bb"+s1;
這個創建幾個對象呢。真確的是編譯後有兩個對象會產生:「aa","bb".
運行時又產生對象s2(嚴格說是個對象的引用)
總結,編譯器對,常量運算,會進行編譯優化處理。
但對於帶有變數的運算。只有運行程序才進行處理!
⑹ 如何在編譯java的時候,取消編譯器對編譯常量的優化
遇到的問題是想重新編譯某個java文件(比如A.java),裡面有個常量(比如finalinta)和上次編譯時不一樣,但是另一個使用A.class的a的文件(比如B.java)由於在javac在上次編譯的時候將當時的A.class裡面的常量直接給內聯了,所以就達不到想要的效果。
如果是這樣的話,對於String可以使用.intern()來防止編譯器進行優化,對於其他類型,可以要麼不定義為常量,要麼將常量定義為private,然後使用一個static方法來返回這個常量。
⑺ int a[100] 這400個位元組的空間編譯時並不分配
編譯時當然不分配,運行時才分配。
編譯把源程序翻譯成機器指令:「給a分配100個單元,整型」
執行程序時,操作系統按指令分配,無所謂聰明不聰明。
⑻ 編譯器優化怎麼定義
常見的優化和變新有:函數內嵌(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),如何選擇合適的機器指令,如何合並幾句代碼成一句等等。
⑼ 誰能介紹一下代碼優化中的常量繁殖constant propagation
連續不斷的傳送(constant propagation)等。它還賦予優化某些特定於Java技術的性能。如:空-檢查(null-check)和值域-檢查(range-check)刪除等。寄存器分配程序(register allocator)是一個用顏色表示分配程序的全局圖形,它充分利用了大的寄存器集(register sets)。Java HotSpot性能引擎的全優化編譯器的移植性能很強,它依賴相對較小的機器描述文件來描述目標硬體的各個方面。盡管編譯器採用了較慢的JIT標准,但它仍然比傳統的優化編譯器要快得多。而且,改善的代碼質量也是對由於減少已編譯代碼的執行次數而節省的時間的一種"回報"。