我只是在阅读 gcc 手册以找出 -O3
之间的区别和 -Ofast
.
对于 -O3
-O3
Optimize yet more. -O3 turns on all optimizations specified by -O2 and also turns on the following optimization flags: -fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-paths -ftree-loop-distribute-patterns -ftree-loop-distribution -ftree-loop-vectorize -ftree-partial-pre -ftree-slp-vectorize -funswitch-loops -fvect-cost-model -fversion-loops-for-strides
虽然
-Ofast
-Ofast
Disregard strict standards compliance. -Ofast enables all -O3 optimizations. It also enables optimizations that are not valid for all standard-compliant programs. It turns on -ffast-math, -fallow-store-data-races and the Fortran-specific -fstack-arrays, unless -fmax-stack-var-size is specified, and -fno-protect-parens
因此我想知道,是否可能
-Ofast
出于某种原因,它不如 -O3
安全,因此我应该坚持 -O3
大多数时候。你能澄清使用它们时的“实际差异”吗?如果
-Ofast
实际上安全吗?
最佳答案
Ofast
启用违反 C 标准对浮点语义的要求的优化。特别是在 -Ofast
下(又名 -ffast-math
)它会自由地重新排序浮点计算(默认情况下是禁止的,因为通常 a + (b + c) != (a + b) + c != a + (c + b)
用于浮点数)。
是否-Ofast
在特定情况下是否安全取决于算法,但通常大多数非科学应用程序都能很好地使用它。例如,大多数游戏引擎都是用 -ffast-math
构建的。 .
关于-O3 与 -Ofast 优化之间的 gcc 差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61232427/