Qu'est-ce que Pointeur de fonction ?

Pointeur dont la valeur est l'adresse d'une fonction. On le déclare en incluant les types des arguments et du retour, comme int (*fp)(int, int) = add;, et on appelle la fonction pointée par fp(1, 2) ou (*fp)(1, 2). Un tableau de pointeurs de fonction forme une table qui choisit le traitement selon un numéro. Les pointeurs de fonction servent aux fonctions de rappel (callbacks), comme la fonction de comparaison passée à qsort, aux tables des vecteurs d'interruption et aux traitements de chaque état d'une machine à états. En langage machine, l'appel devient un appel indirect, qui saute à une adresse contenue dans un registre.

Nom japonais: 関数ポインタ

« Pointeur de fonction » apparaît dans 3 questions d'entraînement réparties sur 2 thèmes, dont ISA et assembleur, Bases de la programmation en C.

Domaine: Bases de la programmation en C

S'entraîner : questions sur Pointeur de fonction

En RISC-V, quelle instruction réalise généralement un appel par pointeur de fonction en C, « (*fp)(x) » ?

  1. APlacer l'adresse de la fonction dans un registre et sauter à cette adresse avec jalr
  2. BSauter avec jal en écrivant l'adresse de la fonction comme immédiat
  3. CComparer avec beq l'adresse de la fonction et sauter si elles sont égales
Afficher la réponse et l'explication

Réponse : A. Placer l'adresse de la fonction dans un registre et sauter à cette adresse avec jalr

La cible d'un pointeur de fonction n'étant connue qu'à l'exécution, jal, qui inscrit la destination dans l'instruction, est inutilisable. On charge donc la valeur du pointeur dans un registre, on saute à l'adresse de ce registre avec par exemple « jalr ra, 0(t0) », et l'adresse de retour reste dans ra. Les appels de fonctions virtuelles C++ et de fonctions de bibliothèques partagées sont des appels indirects similaires. La destination variant, le CPU la prédit à l'aide d'un prédicteur de branchements indirects.

« Pointeur de fonction » dans les explications

Questions mentionnant « Pointeur de fonction » (3)

  1. En RISC-V, quelle instruction réalise généralement un appel par pointeur de fonction en C, « (*fp)(x) » ?
  2. Quelle est la sortie obtenue en exécutant le programme ci-dessus, qui utilise un tableau de pointeurs de fonction ?
  3. En quelle instruction la pseudo-instruction RISC-V « ret » est-elle réellement exécutée ?

Termes associés

Pointeur Adresse de retour Tableau Pseudo-instruction Alignement et remplissage (padding) Allocation dynamique de mémoire Champ de bits (bit-field) Comportement indéfini (undefined behavior) Débordement de tampon (buffer overflow) Fuite de mémoire (memory leak)

Retour au glossaire