Compiler construction 为什么不总是使用编译器优化?
具有未定义的行为,因此编译器优化实际上导致程序中断 但如果代码中没有未定义的行为,那么有没有理由不使用编译器优化?我理解,有时出于调试目的,可能不需要优化的代码(如果我错了,请纠正我)。除此之外,在生产代码上,为什么不总是使用编译器优化呢Compiler construction 为什么不总是使用编译器优化?,compiler-construction,compiler-optimization,Compiler Construction,Compiler Optimization,具有未定义的行为,因此编译器优化实际上导致程序中断 但如果代码中没有未定义的行为,那么有没有理由不使用编译器优化?我理解,有时出于调试目的,可能不需要优化的代码(如果我错了,请纠正我)。除此之外,在生产代码上,为什么不总是使用编译器优化呢 此外,是否有理由使用,比如说,-O而不是-O2或-O3?简单。编译器优化错误。刚刚发生在我身上。由for interface Java生成的代码是正确的,但不能与gcc上的-O2一起使用。一个例子是短路布尔求值。比如: if (someFunc() &
此外,是否有理由使用,比如说,
-O
而不是-O2
或-O3
?简单。编译器优化错误。刚刚发生在我身上。由for interface Java生成的代码是正确的,但不能与gcc上的-O2一起使用。一个例子是短路布尔求值。比如:
if (someFunc() && otherFunc()) {
...
}
“智能”编译器可能会意识到someFunc由于某种原因总是返回false,使整个语句的计算结果为false,并决定不调用otherFunc以节省CPU时间。但是,如果otherFunc包含一些直接影响程序执行的代码(可能会重置全局标志或其他内容),它现在将不会执行该步骤,并且程序将进入未知状态。编译器优化有两个缺点:
如果您希望能够对发布的生产代码执行调试,那么最好不要优化代码。如果没有未定义的行为,但存在明确的破坏行为(确定性正常错误或不确定的竞争条件),关闭优化是值得的,这样您就可以使用调试器逐步完成代码。 通常,当我达到这种状态时,我喜欢做以下组合:
一,。此类程序通常不符合标准,因此优化器在技术上是“正确的”,但仍然没有达到开发人员的预期。原因是您开发一个应用程序(调试版本),而您的客户运行完全不同的应用程序(发布版本)。如果测试资源不足和/或使用的编译器不是很流行,我将禁用对发布版本的优化
MS发布了许多针对MSVC x86编译器中优化错误的修补程序。幸运的是,我在现实生活中从未遇到过。但其他编译器并非如此。SMS编译器在MS嵌入式Visual C++中是非常错误的。 < P>我看到的两个大的原因
#include <stdio.h>
int puts(const char *str) {
fputs("Hello, world!\n", stdout);
return 1;
}
int main() {
printf("Goodbye!\n");
return 0;
}