当我将-O2
标志传递给 gcc 时,gcc 会优化代码,但我想知道如果我将所有源文件编译为目标文件然后将它们链接起来,它实际上能做到这一点。
这是一个例子:
// in a.h
int foo(int n);
// in foo.cpp
int foo(int n) {
return n;
}
// in main.cpp
#include "a.h"
int main(void) {
return foo(5);
}
// code used to compile it all
gcc -c -O2 foo.cpp -o foo.o
gcc -c -O2 main.cpp -o main.o
gcc -O2 foo.o main.o -o executable
通常, gcc 应该内联foo
,因为它是一个小函数并且-O2
可以使能-finline-small-functions
,对吗?但是在这里,gcc 在创建目标文件之前只看到foo
和main
独立的代码,所以不会有任何这样的优化,对吧?那么,这样编译真的会让代码变慢吗?
但是,我也可以像这样编译它:
gcc -O2 foo.cpp main.cpp -o executable
那会更快吗?如果没有,这样会更快吗?
// in foo.cpp
int foo(int n) {
return n;
}
// in main.cpp
#include "foo.cpp"
int main(void) {
return foo(5);
}
编辑:我看了看objdump
,它的反汇编代码显示只有这#include "foo.cpp"
件事有效。