
【计】 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)是编译器通过提取重复计算来提升性能的技术。但若遇到“假公共子表达式”,直接优化可能导致计算结果错误。因此编译器需通过数据流分析,识别此类“假”情况,避免错误优化。
该术语强调代码中表面可优化但实际存在隐藏风险的表达式,是编译器优化中需要谨慎处理的问题。
标题卡片穿插从属存储器转储地址任选项断肢存在幻觉独特的广漠无际的合法监禁谎回弹性狭窄回送校验加工车间降落交互式图象处理酵母菌性指间糜烂甲型胶醇志贺氏菌结肠变形虫节奏君主主义浪涌模拟程序念珠藻科普赖厄氏试验普里斯特利氏物质氢化聚合作用轻质馏出油料熔度声压电话机组渗析液受精前的通行证