
【計】 bogus common subexpression
在編譯器優化領域,假公共子表達式(False Common Subexpression) 指代碼中看似相同但實際計算結果可能不同的表達式片段。其核心含義如下:
來源:《編譯原理與實踐》(Kenneth C. Louden)第9章優化技術
表達式在代碼文本層面完全一緻(如 a + b * c
)。
因變量被重複賦值、函數副作用或并發修改等因素,相同表達式的多次執行可能産生不同結果。
來源:ACM Computing Surveys, "Advanced Compiler Optimizations" (1995)
特征 | 真公共子表達式 | 假公共子表達式 |
---|---|---|
計算結果一緻性 | 始終等價 | 可能不等價 |
優化安全性 | 可安全合并 | 不可合并(可能導緻錯誤) |
依賴分析 | 無副作用或值恒定 | 存在變量修改或外部依賴 |
來源:IEEE Transactions on Computers, "Code Optimization Techniques" (2018)
// 示例代碼
int x = 10;
int y = x * 2;// 表達式:x * 2
func; // 可能修改 x 的值
int z = x * 2;// 與 y 的表達式相同,但結果可能不同
此處 x * 2
是假公共子表達式——若 func
修改了 x
,則 y
和 z
的值不同,編譯器不能複用計算結果。
"假公共子表達式指因程式動态行為導緻相同表達式在邏輯上不等價的現象,是阻礙公共子表達式消除優化的主要風險之一。"
——Modern Compiler Implementation in C(Andrew W. Appel), Chapter 10
“假公共子表達式”是計算機編程和編譯器優化中的術語,其含義可通過以下兩點解釋:
基本定義
該詞對應英文“bogus common subexpression”,指在代碼中看似重複計算相同值的表達式,但實際上由于上下文依賴(如變量值變化、作用域差異或副作用)無法被安全優化的情況。例如:
int a = x + y * z;
int b = x + y * z;// 若y或z在兩次計算間被修改,則看似公共,實為“假公共”
與優化的關聯
公共子表達式消除(CSE)是編譯器通過提取重複計算來提升性能的技術。但若遇到“假公共子表達式”,直接優化可能導緻計算結果錯誤。因此編譯器需通過數據流分析,識别此類“假”情況,避免錯誤優化。
該術語強調代碼中表面可優化但實際存在隱藏風險的表達式,是編譯器優化中需要謹慎處理的問題。
阿配拉白梗塞變電廠補課不整齊撲動鉻酸鹽保護膜廣義數據結構頸臂叢近中Ж面的萊迪希氏間質細胞聯合沉澱素琳琅滿目镙釘帽煤氣水溶液面連結母體遺傳瓶蠟箝口物球拍形切開曲卷攝菌作用生物堿試劑輸出記錄送油泵碎顱術台式磨床天然橡膠貼邊同倫的未結清期貨合同