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.

questionAnswers(3)

yourAnswerToTheQuestion