作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现代编译器中的优化越来越好,通过基本优化(如常量折叠)来利用 SIMD 指令。然而,我想知道这些优化应该进行到什么程度,以及现在编译器是如何做出这个决定的。
让我们看一个例子:
#include <stdio.h>
static double naive_sin(double n) {
return n - n*n*n / 6.0 + n*n*n*n*n / 120.0 + n*n*n*n*n*n*n / 5040.0;
}
int main() {
printf("%f\n", naive_sin(1.0));
return 0;
}
-O3
,可以观察到得到的浮点数是由编译器计算出来的,并存储在源代码中。进一步优化显然是不可能的。
#include <stdio.h>
int main() {
double start = 0.0;
for (int i = 0; i < 100; i++) {
start += 1.0;
}
printf("%f\n", start);
return 0;
}
100.0
。在生成的机器代码中。但是,在查看输出时,结果发现循环仍然存在!
最佳答案
这实际上只是启用了哪些优化以及编译器中实际可用的优化的问题。一些优化,如函数内联和常量传播,基本上是普遍可用的并且相对容易实现。因此,大多数编译器将使用大多数优化设置来优化第一个程序。
第二个程序需要循环分析和循环消除来优化,这要复杂得多。编译器可能可以优化第二个程序,但您的编译器很可能没有优化此类循环的机制(证明浮点优化的正确性通常比证明整数优化的正确性要复杂得多)。请注意,如果 start
,我的 GCC 版本确实优化了循环被声明为 int
.
关于c - 提前编译器如何确定优化要走多远?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18027467/
我正在使用 react-native-elements ListItem.Accordion因为我的 React Native 中的所有其他内容 SectionList使用 ListItem s(并且
我是一名优秀的程序员,十分优秀!