C++学习--编译优化

常量折叠

把常量表达式的值求出来作为常量嵌在最终生成的代码中。

疑问:对于一个很复杂的常量表达式,编译器会算出结果再编译吗?亦或者是把这个表达式完全翻译成机器码,最终留给程序去解决?

分情况:

  • 涉及的常量折叠是否为语言规范所强制要求的,如果是,则符合规范的编译器就一定要(会)进行常量折叠。
  • 如果不符合上一条,那是编译器实现质量的问题。一个编译器可以自由选择是否做常量折叠优化。同一编译器有可能可以配置在不同的优化层级上工作,或许有些再低优化层级没有被常量折叠的代码,在高优化层级会被优化。

常量传播

考虑如下例子:

int x = 40;
int y = x + 2;

像C语言、Java语言之类的,语言规范层面上都不会把y的初始化表达式 x + 2 规定为一个常量表达式。但我们直觉上觉得编译器应该能把它也给常量折叠起来。

这就需要常量传播优化了。

但是一个变量被允许多次赋值,如:

int x = 40;
x = rand();
int y = x + 2;

要实现常量传播,必须依赖『到达定值』的前向数据流分析 (fastword data-flow analysis)——确定某个定值能被传播到哪些使用点。

猜你喜欢

转载自www.cnblogs.com/CocoML/p/12727165.html