在哪个级别应用了编译器优化?

Met*_*est 4 c compiler-construction optimization gcc

我的问题是哪个级别的编译器应用优化.它是在不同的代码文件级别?如果是这种情况,那么它是否比在整个代码中应用它更低效?其次,当一个源文件没有进行优化编译然后与一个-O3级优化链接时会发生什么?

我特别感兴趣知道gcc如何处理这些事情.

Ker*_* SB 5

可以使用单独的优化标志编译单个翻译单元,这通常不是问题.编译时优化通常仅影响一个TU内的可见代码.

该规则的一个例外是标志-fwhole-program,它表示您的源代码构成整个程序并允许更积极的优化:

gcc -o prog *.c -O3 -fwhole-program -s
Run Code Online (Sandbox Code Playgroud)

也就是说,GCC最近在链接时引入了另一层优化; 使用它,用-flto(GCC 4.6)编译所有内容.但是,这也与每个TU的优化标志无关:

gcc -c module1.c -flto -O2
gcc -c module2.c -flto -O3 -fno-strict-aliasing
gcc -c module3.c -flto -O0
gcc -c module4.c -O1
gcc -o prog module*.o -flto -s
Run Code Online (Sandbox Code Playgroud)

最后,您还-O*可以在链接阶段指定一个独立选项,但我不知道这是否有所不同.

另请注意,预编译的头文件无法独立优化; 只有使用与TU相同的优化设置编译PCH才符合条件.