3
A
回答
11
是的,你甚至可以驗證它自己。拿一個小的Java文件,例如:
public class Main {
public Main() {
int i = 10 + 20;
}
}
與javac Main.java
編譯它,然後運行javap -c Main
拆卸它:
Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: bipush 30
6: istore_1
7: return
}
顯然在字節碼,你可以看到編譯器的優化:bipush 30
!
6
是的。該編譯器優化被稱爲constant folding。還有另外一個名爲sparse conditional constant propagation的編譯器優化可以做類似的事情。
一般來說,不能保證給定的編譯器實際上會摺疊常量,但現在幾乎每種語言的編譯器都會這樣做。特別是,Java Language Specification要求在編譯時對常量表達式進行評估。
4
是的,它將被簡化爲as required by the JLS(感謝@EJP的精度)。
如果你想要更多的資源和javac優化,你應該看看Compiler optimizations或Java Compilers。
另一個有趣的事情是,即使您的代碼在編譯過程中進行了優化,第二次優化也將在運行期間以hotspot完成。
資源:
關於同一主題:
相關問題
- 1. 在Java編譯期間預先計算紋理
- 2. 編譯但總計不計算
- 3. Project Euler#10如何預先計算素數的總和?
- 4. Java編譯器是否將字節和短字符識別爲文字?
- 5. Matplotlib boxplot使用預先計算的(彙總)統計
- 6. 編譯器內是否有預編譯IPV6的標誌
- 7. 計算預訂表總計
- 8. 計算器編譯問題
- 9. javac是否預先計算固定表達式?
- 10. 追加和預先計算的值由在JSON字符串
- 11. Python:計算數字總和csv文件
- 12. GNU Java編譯器是否支持JNA?
- 13. 是否有一個Java SWF編譯器?
- 14. 是否有Java到Flash編譯器?
- 15. <identifier>預計java編譯錯誤
- 16. 錯誤:;預計(在Java編譯錯誤)
- 17. 計算總和是在MySQL
- 18. 編譯器設計 - 計算常量值
- 19. 保存預先計算的數據與預先計算的數據並在檢索時計算它們
- 20. 編譯器是否會刪除總是評估爲零的塊?
- 21. 將Proguard或編譯器預計算TimeUnit.Minutes.toMillis(120)
- 22. 是否總是計算返回表達式,還是可以通過編譯器進行優化?
- 23. 如果編譯器是MSVC,是否有預定義的定義?
- 24. Java。計算1到5的總和
- 25. Java總計書籍計算
- 26. 計算總和
- 27. 計算總和
- 28. 計算總和
- 29. 計算總和
- 30. 計算總和
您可以依靠評估常量表達式的Java編譯器。這是規範要求的,例如,CE標籤可以是合法的。 – EJP 2010-10-09 23:13:56
@EJP,我不是100%確定的,所以我會改變我的答案,但是你能否提供一個關於這個特定優化的規範的鏈接? – 2010-10-09 23:15:45
在案件表達式中允許CE的事實使其成爲強制性的。見15.28常量表達式。 – EJP 2010-10-09 23:27:37