logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[C] Czy funkcja 'inline' w C może korzystać ze zmiennych lokalnych wywołującej?

dziechu 15 Lis 2014 23:02 1089 5
REKLAMA
  • #1 14135345
    dziechu
    Poziom 27  
    Posty: 1609
    Pomógł: 27
    Ocena: 71
    Funkcja typu inline to funkcja która nie jest wywoływana, lecz jej kod jest wstawiany bezpośrednio w miejsce wywołania. Czy w związku z tym taka funkcja może korzystać ze zmiennych lokalnych funkcji ją wywołującej? Trzeba stosować np. takie same nazwy zmiennych, albo kompilator robi to sam automatycznie?
  • REKLAMA
  • #2 14135540
    mcvsama
    Poziom 16  
    Posty: 94
    Pomógł: 23
    „inline” to podpowiedź dla kompilatora, do której nie musi się wcale zastosować. Z Twojego - programisty - punktu widzenia, to funkcja taka sama jak każda inna. Inline może zmienić szybkość wykonywania i rozmiar skompilowanego programu, ale semantycznie niczego nie zmienia.

    To o czym piszesz to „domknięcia”. Są np. w C++ od C++11, ale nie ma ich w C.
    Przykład z C++:
    Kod: text
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • #3 14136804
    dziechu
    Poziom 27  
    Posty: 1609
    Pomógł: 27
    Ocena: 71
    mcvsama napisał:
    ale semantycznie niczego nie zmienia.

    Dla mnie zmienia. Programuję mikrokontrolery i np. czasem musze kontrolować stos. Normalna funkcja po wywołaniu powoduje zapisanie adresu powrotu na stosie, następnie argumenty funkcji przekazywane są także przez stos. Natomiast jeżeli funkcja inline to kod funkcji wstawiany w miejsce wywołania, to po pierwsze nie ma żadnego skoku i powrotu, po drugie - argumenty nie muszą być przekazywane przez stos a kompilator nie musi tworzyć chwilowo nowych zmiennych, czyli zajmować nowych komórek RAM, bo są to te same zmienne lokalne funkcji gdzie ten kod został wstawiony.
  • REKLAMA
  • Pomocny post
    #4 14137094
    mcvsama
    Poziom 16  
    Posty: 94
    Pomógł: 23
    Cytat:
    Dla mnie zmienia.


    Nie zmienia. Semantyka kodu pozostaje identyczna.

    Piszesz o optymalizacjach, tym się zajmuje optymalizator. Jeśli jest sprytny, to być może użyje zmiennych ze stosu funkcji wywołującej, a jeśli się nie da, to i tak zaalokuje nowe zmienne na stosie. Ty nie masz nad tym bezpośredniej kontroli, możesz co najwyżej kombinować z flagami optymalizacji i sprawdzać w wygenerowanym assemblerze, czy udało Ci się osiągnąć to, co chciałeś.
  • REKLAMA
  • Pomocny post
    #5 14137348
    Eagle
    Poziom 24  
    Posty: 536
    Pomógł: 57
    Ocena: 31
    Jeśli koniecznie chcesz mieć jakiś fragment kodu w odpowiednim miejscu innej funkcji i mieć pewność, że tam się znajdzie, to musisz przyglądnąć się makrom. Inline to sugestia dla kompilatora nie obowiązek, natomiast makro wklei ciało funkcji w to miejsce gdzie rozwiniesz makro. Brzydkie ale skuteczne.
  • #6 14139560
    dziechu
    Poziom 27  
    Posty: 1609
    Pomógł: 27
    Ocena: 71
    Ok, dzięki za odpowiedzi. To tylko rozważania teoretyczne, z czystej ciekawości. Przez wiele lat pisałem programy w asm wielu procesorów, więc siłą rzeczy było to pod moją kontrolą. Teraz zacząłem (od roku) w C. Dało mi to znacznie większe możliwości kosztem - niestety - utraty kontroli, a przynajmniej tak łatwej i bezpośredniej kontroli. Dlatego czasem pytam o takie rzeczy.

    Dodano po 4 [godziny] 36 [minuty]:

    Eagle napisał:
    Inline to sugestia dla kompilatora nie obowiązek

    Głównie chyba to jest najważniejsza informacja - myślałem że to ja decyduję:)

    Dodano po 8 [minuty]:

    mcvsama napisał:
    Nie zmienia. Semantyka kodu pozostaje identyczna.

    Taka w ścisłym znaczeniu semantyka nie zmienia się, zakładając jak np. w przypadku PC że zasoby są praktycznie nieograniczone i liczy się tylko to co wchodzi do funkcji i co z niej wychodzi. Ale w przypadku kontrolerów zasoby są przeważnie ograniczone, czasem bardzo, choćby takie kontrolery jak PIC 16xxx i wcześniejsze, mające sprzętowy stos ośmio poziomowy! (horror). Wtedy kontrola stosu i dokładne wyliczanie zagnieżdżeń (łącznie z możliwymi przerwaniami) dla mnie zmienia semantykę, bo ma ogromny wpływ na to co wychodzi z funkcji (czyli - po przekroczeniu stosu - bzdury lub zawieszenie programu). To kwstia czy do semantyki kodu zaliczamy możliwe katastrofy systemu czy nie;)
REKLAMA