OVH Cloud OVH Cloud

fonctions inline, théorie et pratique

11 réponses
Avatar
Korchkidu
Bonjour =E0 tous,

les fonctions inline sont en th=E9orie faites pour rendre le code plus
rapide. Pourtant, il me semble me souvenir d'une discussion qui
soutenait que de toute fa=E7on, =E7a ne servait =E0 rien car le compilateur
faisait ce qu'il voulait au final. Est-ce vrai ? Dans ce cas, =E0 quoi
=E7a sert de "inliner" des fonctions (=E0 part faire une siggestion au
compilateur) ? Est-ce qu'en inlinant correctement ses fonctions on
arrive =E0 des gains de performances en pratique ?

Meilleures salutations.
K.

1 réponse

1 2
Avatar
Falk Tannhäuser
Gabriel Dos Reis schrieb:
Falk Tannhäuser writes:
| Pascal J. Bourguignon schrieb:
| > Si c'est une récursion terminale, et que le compilateur sait
| > l'optimiser, alors il peut facilement mettre la fonction en ligne,
| > puisqu'elle n'est plus qu'une boucle.
|
| GCC 4.3.2 le fait à partir du niveau d'optimisation -O2, tandis que
| GCC 3.4.4 ne le faisait pas - on n'arrête pas la progrès !

GCC optimisait la récursivité terminale depuis bien longtemps (du moins,
quand j'étais encore étudiant).

| Je suis sous Cygwin et j'ai essayé avec la fonction
|
| unsigned factorial(unsigned n)
| {
| return n <= 1 ? 1 : n * factorial(n - 1);
| }

Ceci n'est pas une récursivité terminale.



Exact - il s'agit de récursion enveloppée ; donc ce qui a changé entre
GCC 3 et GCC 4 est que le dernier est capable de transformer la récursion
enveloppée en récursion terminale, au moins dans un cas relativement simple
comme celui-ci.

Falk
1 2