Funkcje inline w C

0

Cześć :)
Napisałem sobie pewną funkcję inline w języku C:

inline int getLength();

a następnie wywoływałem ją w main.
Potem skompilowałem sobie tak:
gcc main.c -o out -gddb

Po zdisassemblowaniu ku mojemu zdziwieniu funkcja nie została "wklejona" w miejsce wywołania. Jest normalne, wywołanie postaci: call <adres>

O co chodzi?

1

a jak skompilujesz z flaga -O0?
Podejrzewam tu jakis rodzaj omptymalizacji robiony przez kompilator, ale nie jestem pewien. Bo nie powinno byc optymalizacji w taki sposob jak kompilujesz

Gdzies czytalem ze inline "jest" przezytkiem i kompilator bardzo czesto omija to slowo nie zwracajac na to uwagi (jezeli nie ma dodatkowych slow kluczowych typu extern czy static na przyklad)

0

w c nie ma inline

2

W C jest inline, ale to tylko wskazówka dla kompilatora, a nie obligatoryjne przykazanie, że ma tak wstawić.

6

Jeżeli chodzi o samo wstawianie kodu funkcji w miejsce wywołania, słowo kluczowe inline w C i C++ to tylko wskazówka dla kompilatora, który może ją całkowicie zignorować. Nie może za to zignorować tego, że taka funkcja może pojawić się w wielu jednostkach translacji (i konsekwencji tego). To znaczy: działanie inline nie jest ignorowane, ignorowane może być życzenie wstawiania kodu w miejscu wywołania. Żeby zmusić GCC do wstawienia funkcji inline użyj __attribute__((always_inline)) (przed średnikiem w deklracji funkcji). (Hint: Zmuszanie może być niemądre)

2

Nie jestem pewien czy tak jest w C, ale w C++ główną funkcją inline jest zezwolenie na wielokrotne definicje funkcji bez łamania ODR.

1
Zimny Lew napisał(a)

O co chodzi?

O to, że daj sobie spokój z inline. Kompiluj z -O3 i kompilator odpowiednio małe funkcje sam wrzuci w miejsce wywołania. A dużych i tak nie ma sensu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1