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"?
Odpowiedz
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.
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). –
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? –
@AnT, jak zapobiec kompilacji od inlineing funkcji, które są wywoływane tylko raz. – bharath
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.
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
OK, zaktualizuję na podstawie Twojego komentarza, dziękuję za to. – Marcin
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.
"-O3 Ta opcja włącza droższych optymalizacje, takich jak funkcja inline"
są one drogie, ponieważ funkcja jest zasadniczo powielana, poświęcając pamięć na szybkość. –
@ 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
* potencjalnie kosztowne * –
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.
- 1. C++: funkcje zewnętrzne i inline
- 2. C++ gcc ciąg inline
- 3. Kiedy słowo kluczowe "inline" działa w C?
- 4. Głębokość inline kompilator GCC w
- 5. Zachowanie __LINE__ funkcje inline
- 6. Montaż inline w GCC: ograniczenia
- 7. GCC inline ASM o zmiennej
- 8. Czy mogę przestać używać "inline" w ogóle?
- 9. Czy istnieje szybka metoda deklarowania funkcji inline?
- 10. Zespół inline w stylu Intela w gcc
- 11. bezpośrednie połączenia z użyciem zestawu inline GCC
- 12. Jakie są różnice między inline-c i language-c-inline?
- 13. C++ inline metod klasy powoduje niezdefiniowane odniesienie
- 14. funkcja inline w c
- 15. Jak działa F # inline?
- 16. Funkcje pętli szeregowych i funkcji Inline
- 17. GCC vs brzękiem: inline funkcję z -fPIC
- 18. Inline funkcje skalarne: prawdziwe lub vaporware?
- 19. doxygen C++ inline szablon dokumentacji
- 20. Inline Argumenty funkcji Uboczny
- 21. Czy operatorzy inline są dobrzy?
- 22. Cel C: Funkcja Inline - nie znaleziono symbolu
- 23. Cython: Inline Funkcja nie czystym C
- 24. Najkrótszy inicjator kolekcji inline? C#
- 25. GCC INLINE ASSEMBLY Nie pozwól mi nadpisać $ esp
- 26. Jak zapewnić, że wydruk jest inline w gcc?
- 27. Perl XS i Inline :: C
- 28. Jak naprawić błąd inline JavaScript inline JavaScript?
- 29. Czy ma sens stosowanie inline keyword z szablonami?
- 30. Czy stałe statyczne funkcji inline są unikalne?
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
Należy zauważyć, że metody zdefiniowane w definicji klasy (tj. Między '{...};' są domyślnie "inline", nawet bez słowa kluczowego. – MSalters