2012-11-05 13 views
8

Ta część podręcznika gcc jest dość niejasna i nie mogę zrozumieć użycia atrybutu forceinline po wielokrotnych próbach.wymuszona funkcja inline w innej jednostce tłumaczeniowej

Definiuję obiekt i niektóre funkcje do manipulowania tym obiektem. Kilka z tych funkcji może używać instrukcji atomowych i chcę, aby kompilator wbudował te funkcje. Jednak nie chcę zapisywać tych funkcji w pliku nagłówkowym i deklarować ich za pomocą "static inline", tak jak w jądrze Linux.

Czy istnieje sposób na wymuszenie gcc na funkcji inline z innej jednostki tłumaczeniowej?

Odpowiedz

9

można użyć atrybutu always_inline na przykład:

void foo() __attribute__((always_inline)); 

Z docs

always_inline Generalnie funkcje nie są inlined chyba że podano optymalizacji. W przypadku funkcji zadeklarowanych jako wbudowany ten atrybut włącza funkcję , nawet jeśli nie określono poziomu optymalizacji.

Note1: Nie ma potrzeby korzystania inline jeśli użyć atrybutu always_inline

Uwaga2: Jeśli ta funkcja nie może być inlined otrzymasz ostrzeżenie, jeżeli na przykład definicja nie jest dostępne podczas kompilacji, jednak na wyższym gcc optymalizacja może nadal inline go do rozmówcy, jest to swoisty przełącznik że zbyt:

-funit-at-a-time 

z docs:

poziom optymalizacji -O2 i powyżej, w szczególności umożliwiają unit-at-a-time mode, który pozwala kompilator pod uwagę informacje uzyskane od późniejszych funkcji w pliku podczas kompilacji funkcję . Kompilowanie wielu plików naraz do pojedynczego pliku wyjściowego w trybie tryb jednostkowy umożliwia kompilatorowi wykorzystanie informacji uzyskanych z wszystkich plików podczas kompilowania każdego z nich.

Uwaga 3: Nie jest konieczne, aby mieć wyraźny prototypu, dzięki czemu można użyć atrybutu na umowach definicja funkcji:

__attribute__((always_inline)) void foo() { 
    //some code 
} 

zobaczyć także ten discussion, że odpowiedzi na niektóre pytania.

+0

czy działa nawet wtedy, gdy definicja funkcji nie jest dostępna podczas kompilacji określonej jednostki? w jaki sposób kompilator radzi sobie z taką sytuacją. – sgupta

+1

@ user1075375 jak definicja funkcji może być niedostępna? musi tam być, w przeciwnym razie nie będzie kompilacji/link – iabdalkader

+1

"Jeśli implementacja funkcji nie znajduje się w pliku nagłówkowym iw oddzielnej jednostce kompilacji, nie może być wstawiona, chyba że masz kompilator, który może wykonać LTCG" z http: // stackoverflow.com/questions/5187735/how-to-inline-string-h-function-on-linux?rq = 1 – sgupta

Powiązane problemy