我有一些使用-02和-03集合编译的遗留代码。从GCC man文件中我得到了保证:
-O3打开-O2指定的所有优化,并打开-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload和-ftree-vectorize 选项。
因此,乍一看似乎打开这两个标志就像-O3一样。然而,让我想到的是,在这种情况下做正确的事情是-O2可能是“更安全”的选择。显然,编译一些具有所有排列的代码并查看每种情况会发生什么是一件简单的事情,但我想知道是否有人知道GCC是否有关于指定多个优化级别的具体策略,如果是的话它背后的原因是什么?
答案 0 :(得分:34)
来自man page:
如果您使用多个-O选项,无论是否有关卡编号,最后一个选项都是有效的选项。
答案 1 :(得分:0)
对于像我这样过分关心的用户,这里有一个请求优化的代码:
<script>
import TheHeader from "../components/Navigation/TheHeader";
import TheSidenav from "../components/Navigation/TheSidenav";
import ref from "vue";
export default {
components: {
TheHeader,
TheSidenav
},
data() {
return {
displaySidenav: false
};
}
// setup() {
// const displaySidenav = ref(false);
// return { displaySidenav };
// }
};
</script>
这里有四种编译场景:
$ cat dominant_flag.c
#include <stdio.h>
int foo(int i)
{
return 3*i+122;
}
int main(int argc, char **argv)
{
return foo(0xface); // meant to be optimized out
}
一旦我查找常量 $ gcc -g -O0 dominant_flag.c -o flag0
$ gcc -g -O3 dominant_flag.c -o flag3
$ gcc -g -O0 -O3 dominant_flag.c -o flag03
$ gcc -g -O3 -O0 dominant_flag.c -o flag30
,我发现它存在于非优化版本中:
0xface
并在优化版本中优化:
$ objdump -S -D flag0 | grep -w "\$0xface" # 61e: bf ce fa 00 00 mov $0xface,%edi
$ objdump -S -D flag30 | grep -w "\$0xface" # 61e: bf ce fa 00 00 mov $0xface,%edi
整个 foo 调用都消失了:
$ objdump -S -D flag3 | grep -w "\$0xface"
$ objdump -S -D flag03 | grep -w "\$0xface"