Wat is Functiepointer?

Een pointer waarvan de waarde het adres van een functie is. Hij wordt gedeclareerd inclusief de typen van de argumenten en de retourwaarde, zoals in int (*fp)(int, int) = add; en de functie waarnaar hij wijst, wordt aangeroepen met fp(1, 2) of (*fp)(1, 2). Een array van functiepointers vormt een tabel die de verwerking op nummer kiest. Functiepointers worden gebruikt voor callbacks zoals de vergelijkingsfunctie die aan qsort wordt doorgegeven, tabellen met interruptvectoren en de afhandeling van elke toestand in een toestandsmachine. In machinecode wordt de aanroep een indirecte aanroep die springt naar een adres in een register.

Japanse benaming: 関数ポインタ

“Functiepointer” komt voor in 3 oefenvragen uit 2 onderwerpen, bijv. Instructieset en assembly, Basis van programmeren in C.

Vakgebied: Basis van programmeren in C

Nu oefenen: vragen over Functiepointer

Met welke instructie wordt een aanroep via een functiepointer in C, „(*fp)(x)”, in RISC-V gewoonlijk uitgevoerd?

  1. AHet adres van de functie in een register plaatsen en met jalr naar het adres in dat register springen
  2. BMet jal het adres van de functie als immediate schrijven en springen
  3. CMet beq het adres van de functie vergelijken en springen als ze gelijk zijn
Antwoord en toelichting tonen

Antwoord: A. Het adres van de functie in een register plaatsen en met jalr naar het adres in dat register springen

Waar een functiepointer naar wijst, is pas tijdens uitvoering bekend, dus jal, waarbij het doel in de instructie staat, kan niet worden gebruikt. Daarom wordt de pointerwaarde in een register gelezen en met bijvoorbeeld „jalr ra, 0(t0)” naar het adres in het register gesprongen, terwijl het terugkeeradres in ra achterblijft. Ook aanroepen van virtuele functies in C++ en van functies in gedeelde bibliotheken zijn dergelijke indirecte aanroepen. Omdat het doel varieert, voorspelt de CPU het doel met een voorspeller voor indirecte sprongen.

“Functiepointer” in de toelichting

Vragen met “Functiepointer” (3)

  1. Met welke instructie wordt een aanroep via een functiepointer in C, „(*fp)(x)”, in RISC-V gewoonlijk uitgevoerd?
  2. Wat is de uitvoer als het bovenstaande programma, dat een array van functiepointers gebruikt, wordt uitgevoerd?
  3. Als welke instructie wordt de RISC-V-pseudo-instructie „ret” in werkelijkheid uitgevoerd?

Verwante termen

Array Pointer Pseudo-instructie Bitveld (bit-field) Bufferoverloop (buffer overflow) Dangling pointer Dynamische geheugentoewijzing Geheugenlek (memory leak) Integerpromotie (integer promotion) Macro (#define)

Naar de woordenlijst