Powiedzmy, że mam tę małą funkcję w pliku źródłowym
static void foo() {}
i buduję zoptymalizowaną wersję mojego pliku binarnego, ale nie chcę, aby ta funkcja była wbudowana (do celów optymalizacji). czy istnieje makro, które mogę dodać w kodzie źródłowym, aby zapobiec wstawianiu?
Odpowiedzi:
Chcesz mieć atrybut
gcc
-specificnoinline
.Użyj tego w ten sposób:
źródło
GCC ma przełącznik o nazwie
-fno-inline-small-functions
Więc użyj tego podczas wywoływania gcc. Ale efektem ubocznym jest to, że wszystkie inne małe funkcje również nie są wbudowane.
źródło
-fno-inline
ogóle nie działa.gdb
nadal wprowadza metody po przejściu. Coś jest zepsute i wątpię, że tak jestgdb
.Przenośnym sposobem na to jest wywołanie funkcji za pomocą wskaźnika:
Chociaż powoduje to różne instrukcje rozgałęziania, co może nie być twoim celem. Co daje dobry punkt: jaki jest twój cel?
źródło
Wiem, że pytanie dotyczy GCC, ale pomyślałem, że może przydać się trochę informacji o kompilatorach i innych kompilatorach.
noinline
Atrybut funkcji GCC jest dość popularny również w innych kompilatorach. Jest wspierany przez co najmniej:__has_attribute(noinline)
)__TI_GNU_ATTRIBUTE_SUPPORT__
)Ponadto MSVC obsługuje
__declspec(noinline)
powrót do programu Visual Studio 7.1. Intel prawdopodobnie też to obsługuje (starają się być kompatybilne zarówno z GCC, jak i MSVC), ale nie zadałem sobie trudu, aby to zweryfikować. Składnia jest w zasadzie taka sama:PGI 10.2+ (i prawdopodobnie starsze) wspiera
noinline
pragmę, która odnosi się do następnej funkcji:TI 6.0+ wspiera
FUNC_CANNOT_INLINE
pragmę, która (irytująco) działa inaczej w C i C ++. W C ++ jest podobny do PGI:W C jednak nazwa funkcji jest wymagana:
Cray 6.4+ (i prawdopodobnie wcześniej) przyjmuje podobne podejście, wymagając nazwy funkcji:
Oracle Developer Studio obsługuje również pragmę, która przyjmuje nazwę funkcji, cofając się co najmniej do Forte Developer 6 , ale pamiętaj, że musi ona nastąpić po deklaracji, nawet w najnowszych wersjach:
W zależności od tego, jak bardzo jesteś oddany, możesz utworzyć makro, które działałoby wszędzie, ale musisz mieć nazwę funkcji, a także deklarację jako argumenty.
Jeśli, OTOH, nie przeszkadza ci coś, co po prostu działa dla większości ludzi, możesz uciec z czymś, co jest trochę bardziej estetyczne i nie wymaga powtarzania się. Oto podejście, które zastosowałem w przypadku Hedley , gdzie obecna wersja HEDLEY_NEVER_INLINE wygląda tak:
Jeśli nie chcesz używać Hedley (to pojedynczy nagłówek domeny publicznej / CC0), możesz przekonwertować makra sprawdzające wersję bez zbytniego wysiłku, ale więcej, niż jestem gotów włożyć ☺.
źródło
Jeśli pojawi się błąd kompilatora dla
__attribute__((noinline))
, możesz po prostu spróbować:źródło
To właśnie zadziałało dla mnie.
źródło
Użyj
noinline
atrybutu :Prawdopodobnie powinieneś go używać zarówno podczas deklarowania funkcji do użytku zewnętrznego, jak i podczas pisania funkcji.
źródło
Pracuję z gcc 7.2. W szczególności potrzebowałem funkcji nieliniowej, ponieważ musiała zostać utworzona w bibliotece. Spróbowałem
__attribute__((noinline))
odpowiedzi, a takżeasm("")
odpowiedzi. Żaden z nich nie rozwiązał problemu.Wreszcie doszedłem do wniosku, że zdefiniowanie zmiennej statycznej wewnątrz funkcji zmusi kompilator do przydzielenia dla niej miejsca w bloku zmiennej statycznej i do zainicjowania jej przy pierwszym wywołaniu funkcji.
To trochę brudna sztuczka, ale działa.
źródło
inline void foo(void) { ... }
w nagłówku i zadeklarować jąextern inline void foo(void);
w pliku źródłowym biblioteki. Zgodnie z semantyką C99, kompilator będzie mógł wbudować funkcję, kiedy zechce ORAZ wyemitować kod obiektowy w twojej bibliotece. Zobacz Czy „inline” bez „static” lub „extern” jest kiedykolwiek przydatne w C99? .