Czy GCC może lepiej optymalizować rzeczy, gdy kompiluję wszystko w jednym kroku?
gcc optymalizuje kod, gdy go przekazuję-O2
flag, ale zastanawiam się, jak dobrze może to zrobić, jeśli kompiluję wszystkie pliki źródłowe do plików obiektowych, a następnie łączę je później.
Oto przykład:
<code>// 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 </code>
Normalnie gcc powinien być wbudowanyfoo
ponieważ jest to mała funkcja i-O2
pozwala-finline-small-functions
, dobrze? Ale tutaj gcc widzi tylko kodfoo
imain
niezależnie przed utworzeniem plików obiektowych, więc nie będzie takich optymalizacji, prawda? Czy kompilacja w ten sposób naprawdę spowalnia kod?
Jednak mogłem również skompilować to tak:
<code>gcc -O2 foo.cpp main.cpp -o executable </code>
Czy to byłoby szybsze? Jeśli nie, czy byłoby tak szybciej?
<code>// in foo.cpp int foo(int n) { return n; } // in main.cpp #include "foo.cpp" int main(void) { return foo(5); } </code>
Edytować: Spojrzałem naobjdump
, a jego zdemontowany kod pokazał, że tylko#include "foo.cpp"
rzecz zadziałała.