Может ли GCC оптимизировать вещи лучше, если я компилирую все за один шаг?

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".

11
задан thejh 21 April 2012 в 14:22
поделиться