gcc оптимизирует код, когда я передаю ему флаг -O2
, но мне интересно, насколько хорошо он сможет это сделать, если я скомпилирую все исходные файлы в объектные файлы, а затем связать их потом.
Вот пример:
// 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"
.