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 должен inline 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"
.