2010-08-23 13 views
6

Optymalizacje, takie jak stała propagacja, są możliwe dla różnych funkcji w obrębie tej samej jednostki kompilacji (tj. Ten sam plik).Czy kompilatory C/C++ optymalizują się w różnych jednostkach kompilacji?

Na przykład:

int f(int x) 
{ 
    return 3 + x; 
} 

int main(void) 
{ 
    printf("%d\n", 1 + f(4)); 
    return 0; 
} 

W tym przykładzie, że wystarczająco inteligentna kompilator może propagować „4” stałe do funkcji „f”, rozwiązanie arytmetyki całkowitą o drugiej stałej „3 "i propaguje wartość wyniku, a następnie składa wszystko do wartości końcowej" 8 ".

(Dobrze, poprawcie mnie jeśli się mylę ..)

Jednak to, co się dzieje, jeśli funkcja „F” jest w innej jednostce kompilacji. Ponieważ obie jednostki są kompilowane osobno, kompilator nie może optymalizować w ten sposób.

Czy to oznacza, że ​​optymalizacje są możliwe tylko w tej samej jednostce kompilacji, czy też są jakieś opóźnienia w optymalizacji pod kątem czasu połączenia?

+0

Pytanie boczne: Czy skrypt, który tworzy jeden duży plik .c ze wszystkich drzew źródłowych, zwiększa możliwości optymalizacji? –

+3

Tak, umieszczenie całego kodu w jednym pliku nazywa się amalgamacją - http://www.sqlite.org/amalgamation.html - i służy do tego właśnie celu. – sharptooth

+1

tylko wtedy, gdy kod je obsługuje. preprocesor definiuje, statyczne definicje jednostek tłumaczeniowych, limity kompilatorów i inne rzeczy stają na przeszkodzie. OTOH, może również znacznie przyspieszyć budowę. – peterchen

Odpowiedz

5

Zarówno MSVC (od 8,0: VS2005) i GCC (od 4.5) wspiera koncepcję.

  • MSVC wykorzystuje przełącznik kompilatora /GL i wyłącznik łącznikową /LTCG. Documentation

  • GCC musi mieć ona włączona i wykorzystuje -flto, -fwhole-program, -fwhopr i/lub -combine do tego samego skutku. Documentation (poszukiwanie opcji w przeglądarce)

„problem” jest to, że każda jednostka kompilacja (plik źródłowy) (aw przypadku MSVC każdej bibliotece) musi być skompilowany z tym, dzięki czemu można Używaj starych plików binarnych obiektów skompilowanych bez niego. Ułatwia także debugowanie, ponieważ optymalizator jest o wiele bardziej agresywny i nieprzewidywalny.

+0

... i pliki .lib ogromnie ogromny. Mimo to zadziwiające, co może zrobić, aby wyeliminować kod. – peterchen

0

GCC 4.5 wprowadziła optymalizację czasu łącza. AFAIK, działa tylko na obiektach x86 i x64.

1

Program Microsoft Visual Studio obsługuje funkcję WPO (optymalizacja całego programu) włączoną przez przełącznik ltcg (generowanie kodu czasu połączenia).

Powoduje kilka innych problemów, których nie pamiętam w tej chwili i jest preferowany przez wielu programistów.

+0

Oto one: http://msdn.microsoft.com/en-us/magazine/cc301698.aspx 1. Znacznie większe biblioteki statyczne 2. Biblioteki statyczne z "bajtkodami", które mogą stać się nieobsługiwane w dowolnym momencie. – sharptooth

+1

Miałem więcej, z bardzo dużymi bazami kodów. Dodałbym także czas kompilacji. –

+1

@Sharptooth: bytecode to po prostu prezentacja pośrednia. Wiele kompilatorów robi to w ten sposób. Dla optymalizacji czasu łącza zaleca się rekompilację całego programu za każdym razem - w jaki sposób powinny być tworzone kompilacje wydania. Zatem możliwe niekompatybilne wersje kodu bajtowego nie stanowią problemu. – Dummy00001

1

Tak, dla kompilatora Visual C++ w Visual Studio, jest to znane jako Whole Program Optimization:

Pełna optymalizacja programu pozwala kompilator wykonywać optymalizacje z informacji na temat wszystkich modułów programu . Bez całego programu optymalizacja, optymalizacje są wykonywane w przeliczeniu na moduł (compiland) Podstawa

z informacjami na temat wszystkich modułów The kompilator:

  • Optymalizacja wykorzystania rejestrów całej granic funkcji .

  • zrobić lepiej śledzenia modyfikacji globalnej danych, pozwalając zmniejszenie liczby obciążeń i sklepach.

  • Czy lepszą pracę śledzenia możliwy zestaw elementów zmodyfikowanych przez dereference wskaźnik, zmniejszając liczby obciążeń i sklepach.

  • Inline funkcja w module nawet , gdy funkcja jest zdefiniowana w innego modułu.

3

Clang kompiluje do LLVM IR, a łącznik LLVM wykonuje optymalizację całego programu, gdy tworzy natywny plik binarny.

+0

llvm sprawia, że ​​bardzo łatwo można łączyć i dopasowywać moduły i optymalizować je oddzielnie lub w połączeniu. I zapewnia wiele (prawdopodobnie zbyt wiele) możliwości optymalizacji. –

Powiązane problemy