查看“︁公共子表达式消除”︁的源代码
←
公共子表达式消除
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
'''公共子表达式消除''',又称'''CSE'''({{link-en|Common subexpression elimination}}),是一个[[编译器]]优化技术。在执行这项优化的过程中,编译器会视情况将多个相同的[[表达式]]替换成一个[[变量]],这个变量存储着计算该表达式后所得到的值。<ref name="MuchnickAssociates1997">{{cite book|author1=Steven Muchnick|author2=Muchnick and Associates|title=Advanced Compiler Design Implementation|url=https://archive.org/details/advancedcompiler00much|quote=Common subexpression elimination.|date=15 August 1997|publisher=Morgan Kaufmann|isbn=978-1-55860-320-2}}</ref> 该优化技术十分常见,在现代各大编译器中(如[[LLVM]]、[[GCC]])均有实现。 == 例子 == 考虑到下列代码: a = b * c + g; d = b * c + e; 可以观察到 <code>b * c</code> 是两项表达式中的公共子表达式。如果计算这个子表达式并将其计算结果存储起来的开销,低于重复计算这个子表达式的开销,则能够将以上代码转换成以下代码: temp = b * c; a = temp + g; d = temp + e; == 原理 == 执行这项优化的可能性基于表达式的[[定义可达性]]。当以下条件成立,则一个表达式 <math>b*c</math> 在程序的某个点 <math>p</math> 被定义为是可达的: * 从初始节点到点 <math>p</math> 的每条路径在到达 <math>p</math> 之前计算过 <math>b*c</math>; * <math>b*c</math> 被计算后,无论 <math>b</math> 或 <math>c</math> 到点 <math>p</math> 以前都没有被重新赋值过。 由编译器计算的[[成本效益分析]]可以判断出,重复计算该表达式的开销是否大于存储该表达式的计算结果,并且这个分析也要将[[寄存器]]等因素考虑在内。 编译器开发者将公共子表达式消除分成两种: * 本地公共子表达式消除:这项优化技术工作于[[基本块]]之内。 * 全局公共子表达式消除:这项优化技术工作于整个[[子程序|过程]]之中。 == 参考资料 == <references/> {{編譯器優化}} [[Category:編譯器最佳化]]
该页面使用的模板:
Template:Cite book
(
查看源代码
)
Template:Link-en
(
查看源代码
)
Template:編譯器優化
(
查看源代码
)
返回
公共子表达式消除
。
导航菜单
个人工具
登录
命名空间
页面
讨论
不转换
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息