2009-10-10 21 views
19

Mam na myśli this discussion. Nigdy nie napisałem żadnego kodu w C ani w C++. Nie mam tła CS. Jednak pracuję jako programista Java przez 5 lat, a teraz postanowiłem dowiedzieć się więcej o CS i zrobić trochę do nadrobienia.Co to jest wstawianie?

+0

Duplikat z C# world http://stackoverflow.com/questions/648409/inlining-functions, ale myślę, że odpowiedzi tutaj są lepsze – nawfal

Odpowiedz

27

Podczas wykonywania danego fragmentu kodu, za każdym razem, gdy wywołuje się funkcję standardową, czas wykonania jest nieco wyższy niż po zrzuceniu kodu zawartego w tej funkcji. Zrzucanie za każdym razem, gdy cały kod zawarty w funkcji jest na drugim końcu, niemodny, ponieważ w oczywisty sposób prowadzi do całego bałaganu dublowania kodu.

inline rozwiązuje wydajność i łatwość konserwacji problem pozwalając zadeklarować funkcję jako inline (przynajmniej w C++), tak że podczas wywoływania tej funkcji - zamiast aplikację skakali przy starcie - kod w funkcji inline jest wstrzykiwany w czasie kompilacji za każdym razem, gdy wywoływana jest dana funkcja.

Wadą tego jest to, że jeśli wbudowałeś duże funkcje, które często wywołujesz - rozmiar twojego programu może znacznie wzrosnąć (najlepsze praktyki sugerują, aby zrobić to tylko w przypadku małych funkcji).

11

http://en.wikipedia.org/wiki/Inlining

W komputerowych rozszerzalności rolkach lub inline, jest optymalizacja kompilator, który zastępuje funkcję miejscu połączenia z korpusem odbierającym. Ta optymalizacja może poprawić wykorzystanie czasu i przestrzeni w czasie wykonywania, przy możliwym koszcie zwiększania rozmiaru końcowego programu.

0

Zasadniczo, w C/C++, kompilator może wstawiać funkcje, co oznacza, że ​​zamiast wywoływania funkcji wykonującej tę operację, kod zostanie dodany do bloku funkcji wywołującej, więc będzie tak, jakby miał nigdy nie było oddzielnym wywołaniem funkcji.

ten przejdzie do bardziej szczegółowo: http://www.codersource.net/cpp_tutorial_inline_functions.html

0

inline odnosi się do optymalizacji czasu kompilacji, gdzie mała funkcja kodu zostanie wstrzyknięty do funkcji wywołującej zamiast wymagać oddzielnego połączenia.

2

Jak już wspomniano w innych odpowiedziach, inline ma koszt. Zwykle jest to uważane za małe, jednak podczas pomiaru możesz być zaskoczony i dowiedzieć się, że może on być większy niż to, co zyskujesz (więc what other people say jest prawdą: nie optymalizuj, chyba że zmierzyłeś).

Warto zauważyć, że w jądrze Linuksa zaczęli uninlineinować pierwotnie wbudowane funkcje jakiś czas temu, ponieważ koszt był zbyt wysoki (większe funkcje pochłaniały więcej pamięci podręcznej procesora, a wynikające z nich chybienia pamięci podręcznej były droższe niż po prostu wywołanie funkcji, która miała być wstawiona). Zobacz "Rozdział 15: Choroba inline" w doc/Documentation/CodingStyle, aby uzyskać więcej informacji.

+0

Dobra wskazówka i dobry przykład na to, jak rozwój sprzętu może wpłynąć (w tym przypadku: unieważnić) techniki programowe - przepustowość pamięci nie nadążała za szybkością procesora, więc wszystko, co próbuje wymieniać zużycie pamięci dla cykli procesora, może przynieść efekt odwrotny do zamierzonego. –

+0

Tak, dobra uwaga, i to zawsze mnie doprowadza do projektowania kompilatora i api - co zyskujemy, jeśli "mało szczelny kod" jest dyskutowany i doprowadzany do projektowania przez osoby, które nie mają intuicyjnego pojęcia o tym, jak działa maszyna. Urządzenia obliczeniowe to maszyny liczące, tylko maszyny - nic więcej. Więc jeśli bezpieczeństwo przez zaciemnienie jest popularne, możemy to udowodnić dzięki rozprzestrzenianiu się dyskusji projektowych, które uważają, że szczegóły są brudne. –

0

Odpowiedzi optymalizacji kompilatora są prawidłowe. Istnieje jednak inne zastosowanie - w przypadku refactoring, wstawianie oznacza zastąpienie wywołania metody ciałem metody, a następnie usunięcie metody. Zobacz Inline Method. Istnieją podobne refaktoryzacje, takie jak Inline Class.

EDYCJA: Należy pamiętać, że refaktoryzacji dokonuje się ręcznie lub za pomocą narzędzia; w obu przypadkach wymaga zmiany kodu źródłowego.

6

Jako programista Java zazwyczaj nie musisz martwić się o inlinowanie metod.Kompilator Javy Just-in-time może i zrobi to automatycznie w większości miejsc, w których ma to sens.

IDE jak Eclipse może mieć funkcję, która pozwala na inline metody na poziomie kodu źródłowego - nigdy zrobić to na wydajność, tylko dla czytelności kodu (np kiedy zdajesz sobie sprawę, że metoda po prostu wywołuje jeden inny sposób bez dodawania cokolwiek przydatnego).

+0

Tak, jako programista Java, nigdy nie muszę się o to martwić. Ale próbuję się tu nauczyć i zastanawiałem się, co to jest inkarnacja. – Roger

-1

W tej dyskusji Jon Skeet wspomina o kliencie jvm (hotspot) v Server jvm z poprawkami wydajności dostępnymi w czasie wykonywania, jeśli kompilator JIT (just-in-time) może wprowadzać ulepszenia oparte na czasie. To jest "jak to się robi" w Javie.

Początkowo małe fragmenty kodu, które nie były wywoływane z wielu miejsc, byłyby "wstawiane" przez kompilator, co oznacza, że ​​to, co było nazywane pojedynczym, umieszczano bezpośrednio na ścieżce kodu wskaźnika instrukcji, wykonując gałąź funkcji i zwracając kosztuje więcej mocy procesora niż tylko rozwijanie pętli lub wywoływanie funkcji i umieszczanie instrukcji "właśnie tam".

Dziś Singleton jest przedmiotem wielostronicowych dyskusji, a rozwijanie pętli oraz coś w rodzaju wstawiania są nieco usunięte z ich oryginalny kontekst (konteksty). Możesz przeczytać bardzo dogłębną pracę Dov Bulki na ten temat, aby uzyskać C/C++ w tej sprawie. W przypadku języka Java, badanie jego bogatych bibliotek w java.util lepiej zaspokajałoby twoje potrzeby niż studiowanie inline i głębokich problemów z kompilatorem - możesz zawiesić się na okopanych wojnach wewnętrznych w strukturach danych, które przechwalają się rozmowami w 16-bitowy kod i nie kręć się po krzywej uczenia się.

Możesz zrobić instanceof w Javie, który przypomina tabelę vf (nie ma ludzi z ciepłem), ale pomyśl o tym, jak pisałeś w mocno napisanym języku - i teraz będziesz pisał w języku, w którym ciąg może Runaway łatwo wyszukuje, gdzie nie ma biznesu. Ostatnio próbowałem napisać kod, który skonstruował obraz w Javie, robiąc to z kodu C. Wkrótce odkryłem, że patrzę na stół Oxr dla silnego szyfrowania - to nie ma nic wspólnego z kodem, który pisałem.

Jak napisać klasę ciągów w języku C/C++, która ma mały bufor dla ciągów poniżej 32 bajtów i wskaźników pułapek, aby działały tylko na łańcuchu?

Nie próbując cię drażnić ani nic takiego, to po prostu naprawdę dobre miejsce do rozpoczęcia, a nie do inlineinowania i nauki kompilacji.

0

Funkcje wbudowane są zwykle używane w plikach nagłówkowych C++, a nie w języku Java. Plik nagłówkowy C++ zwykle nie zawiera zaimplementowanego kodu i jest uważany za interfejs do pliku cpp o tej samej nazwie, który zwykle zawiera zaimplementowany kod. Włączenie funkcji wstawiania do pliku nagłówkowego jest legalne, zwykle jest to niewielka funkcja lekka. Funkcje wbudowane nie są kosztowne, więc nie powinny być operacjami wymagającymi dużej ilości pamięci. W przypadku małych procedur wydajność jest minimalna i są one bardziej wykorzystywane dla wygody.