2009-07-17 9 views
5

Piszę projekt akademicki o extremely long functions in the Linux kernel.Czy napisałeś bardzo długie funkcje? Jeśli tak, dlaczego?

W tym celu szukam przykładów rzeczywistych funkcji, które są wyjątkowo długie (kilkaset linii kodu), które nie są uważane za złe programowanie (tj. Nie będą czerpać korzyści z dekompozycji lub użycie tabeli wysyłkowej).

Czy kiedykolwiek napisałeś lub widziałeś taki kod? Czy możesz opublikować lub link do niego i wyjaśnić, dlaczego tak długo?

Otrzymywałem niesamowitą pomoc od społeczności - każdy pomysł, który zostanie przyjęty do projektu, zostanie należycie uznany.

Dzięki,

Udi

+3

Powinieneś prawdopodobnie utworzyć tę wiki społeczności, ponieważ jest to osobiste pytanie. – Brandon

+0

On tego nie zrobi. I on teraz publikuje dupki, co prawdopodobnie nie pomoże jego projektowi badawczemu. Zobacz jego inne posty dla dowodów. –

+0

Dobrze, że jesteś. Widzę, że zrobiłeś tę samą sugestię w jednym ze swoich wcześniejszych tematów. – Brandon

Odpowiedz

10

Najdłuższe funkcje, jakie kiedykolwiek napisane wszystkie mają jedną wspólną cechę, bardzo duży oświadczenie przełącznik. Są chwile, kiedy trzeba włączyć długą listę pozycji, a to tylko utrudni zrozumienie, jeśli spróbujesz zmienić niektóre opcje w oddzielną funkcję. Posiadanie dużych instrukcji przełączników sprawia, że ​​cykliczna złożoność przechodzi przez dach, ale często jest lepsza niż alternatywne implementacje.

3

Poprzednia praca: wyjątkowo długa instrukcja przypadku, linie IIRC 1000+. To było długo przed obiektami. Każda opcja miała tylko kilka linii. Rozbicie go sprawiłoby, że stało się to mniej jasne. W rzeczywistości istniała para takich procedur, które robiły różne rzeczy w tym samym bazowym zestawie typów danych.

Niestety, nie mam już kodu i nie jest to moja publikacja.

0

Mogę sobie wyobrazić, że gdy prędkość jest ważna (np. Gdy trzymasz jakiś rodzaj blokady w jądrze), nie chcesz dzielić funkcji ze względu na narzut związany z wykonywaniem połączenia funkcjonalnego. Po skompilowaniu parametry muszą być wciśnięte na stos, a dane muszą zostać wyrzucone przed powrotem. Dlatego możesz mieć dużą funkcję ze względu na wydajność.

+0

Być może, ale, jak skomentował Neil wcześniej - inlineing jest odpowiedzią na ten problem. –

2

Najdłuższa funkcja, której nie uznałem za okropną, byłaby kluczową metodą niestandardowej maszyny wirtualnej CPU. Podobnie jak w przypadku @epotter, wymagało to dużej instrukcji switcha. W rzeczywistości powiedziałbym, że wiele metod, które uważam, że są odporne na wyraźne rozbicie lub poprawienie czytelności, wymagają instrukcji switch.

1

Niestety, często nie można znaleźć tego typu podprogramu, który jest zaznaczony lub wysłany gdzieś, jeśli jest automatycznie generowany podczas etapu kompilacji za pomocą generatora kodu.

Poszukaj projektów, które mają C wygenerowany z innego języka.

3

To był ostatni, zanim zostałem zwolniony.

1

Poza wydajnością, uważam, że rozmiar stosu wywołań w przestrzeni jądra to 8K (proszę sprawdzić rozmiar). Ponadto, o ile mi wiadomo, kod w jądrze jest dość specyficzny. Jeśli jest mało prawdopodobne, że jakiś kod zostanie ponownie użyty w przyszłości, to po prostu spraw, aby był on funkcją, biorąc pod uwagę narzut funkcji.

Powiązane problemy