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 ?
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
Gabriel Dos Reis schrieb:
Falk Tannhäuser <tannhauser86549spam@free.fr> 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 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.