2009-10-26 19 views
25

Czy GCC, podczas kompilowania kodu C++, kiedykolwiek próbuje zoptymalizować pod kątem szybkości, wybierając wbudowane funkcje, które nie są oznaczone słowem kluczowym inline?Czy funkcje inline C++ GCC nie zawierają słowa kluczowego "inline"?

+10

Zgodnie ze specyfikacją słowo kluczowe 'inline' w C++ nie ma nic wspólnego z optymalizacją kompilatora o tej samej nazwie. Słowo kluczowe oznacza po prostu, że linker powinien spodziewać się wielu definicji funkcji. Tak się składa, że ​​prostota optymalizacji * jest łatwiejsza (ponieważ pełna definicja może być widoczna w wielu jednostkach tłumaczeniowych), ale jest to tak blisko, jak to tylko możliwe. Kompilator może wstawiać funkcje, które nie są oznaczone jako 'inline', a funkcje oznaczone jako' inline' niekoniecznie są wstawiane przez kompilator. – jalf

+2

Należy zauważyć, że metody zdefiniowane w definicji klasy (tj. Między '{...};' są domyślnie "inline", nawet bez słowa kluczowego. – MSalters

Odpowiedz

31

Tak. Każdy kompilator może wbudować dowolną funkcję, gdy tylko uzna, że ​​jest to dobry pomysł. GCC również to robi.

Na poziomie optymalizacji -O2 proces wstawiania jest wykonywany, gdy kompilator uważa, że ​​warto to zrobić (użyto heurystyki) i, jeśli nie zwiększy to rozmiaru kodu. W -O3 robi się to za każdym razem, gdy kompilator myśli, że warto to robić, niezależnie od tego, czy zwiększy to rozmiar kodu. Dodatkowo, na wszystkich poziomach optymalizacji (z włączoną optymalizacją), funkcje statyczne, które są wywoływane tylko raz, są wstawiane.

+0

GCC mówi w odniesieniu do '-finline-functions'" Rozważ wszystkie funkcje do wstawiania, nawet jeśli nie są one zadeklarowane inline. "Wywnioskowałem z tego, że funkcje zadeklarowane za pomocą' inline' będą brane pod uwagę przy wstawianiu, nawet jeśli zwiększą rozmiar kodu. wskazówka od 'inline' do kompilatora jest przestarzała, ale oznaczałoby to, że' -O2' podpowiedź nie byłaby przestarzała, ponieważ wstawiałaby tylko funkcje zwiększające kod, jeśli mają słowo kluczowe 'inline'. -O3 "byłoby przestarzałe (I oznacza podpowiedź ... słowo kluczowe "inline" ma inne cele). –

+1

Mam problem z utworzeniem funkcji, która ma być duża, aby była wstawiona z opcją -O2. Każda utworzona przeze mnie funkcja, która jest oparta na -O3, jest również oparta na -O2.GCC w odniesieniu do '-finline-small-function' mówi" Zintegruj funkcje z ich wywołującymi, gdy ich ciało jest mniejszy niż oczekiwany kod wywołania funkcji (więc ogólny rozmiar programu staje się mniejszy) ". Jednak gdy patrzę na montaż nawet przy -O2, to wyraźnie zwiększa on kod. Czy masz przykład, gdzie O3 wstawia, ale O2 nie? –

+0

@AnT, jak zapobiec kompilacji od inlineing funkcji, które są wywoływane tylko raz. – bharath

7

Tak, zwłaszcza jeśli włączony jest wysoki poziom optymalizacji.

Istnieje flaga, którą można podać do kompilatora, aby wyłączyć to: -fno-inline-funkcje.

+2

W rzeczywistości funkcje -fno-inline blokują automatyczne wstawianie i -fno-inline tłumi wszystkie inlining (źródło: http://gc.gnu.org/onlinedocs/gnat_ugn_unw/Switches-for-gcc.html) – KeatsPeeks

+0

OK, zaktualizuję na podstawie Twojego komentarza, dziękuję za to. – Marcin

3

Jeśli używasz "-finline-functions" lub "-O3", będzie on wstawiał funkcje. Możesz również użyć opcji "-finline_limit = N", aby dostroić stopień jej wstawienia.

1

"-O3 Ta opcja włącza droższych optymalizacje, takich jak funkcja inline"

+0

są one drogie, ponieważ funkcja jest zasadniczo powielana, poświęcając pamięć na szybkość. –

+1

@ Ape-inago: Zależy od małych funkcji, takich jak operatory i akcesoria, wersje liniowe są często tańsze, ponieważ wymagają mniej instrukcji do wstawiania niż zapisywania i przywracania rejestrów wokół wywołania funkcji. – Adisak

+0

* potencjalnie kosztowne * –

1

Tak, tak, chociaż to będzie również generować non-inlined funkcja dla funkcji innych niż static non-inline, ponieważ jest to konieczne w przypadku połączeń z innych jednostek tłumaczeniowych.

Dla funkcji inline nie można podać treści funkcji, jeśli funkcja jest używana w dowolnej jednostce tłumaczeniowej, więc nie stanowi to problemu.