bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans les
fichier en-tête.
non
Visiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte les
fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Est ce que c'est "propre" de faire ca ?
Faut faire attention
tous les commentaires m'interessent, merci ;))
bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans les
fichier en-tête.
non
Visiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte les
fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Est ce que c'est "propre" de faire ca ?
Faut faire attention
tous les commentaires m'interessent, merci ;))
bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans les
fichier en-tête.
non
Visiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte les
fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Est ce que c'est "propre" de faire ca ?
Faut faire attention
tous les commentaires m'interessent, merci ;))
je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
"Geoffrey" writes:je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le compilateur ignore
totalement ce qui vient ou pas des en-tetes.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF:
http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Geoffrey" <gbaudin2@wanadoo.fr> writes:
je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le compilateur ignore
totalement ce qui vient ou pas des en-tetes.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF:
http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
"Geoffrey" writes:je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le compilateur ignore
totalement ce qui vient ou pas des en-tetes.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF:
http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans
les fichier en-tête.
nonVisiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte
les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans f2.cpp.
'inline', ça veut dire que le code généré de la fonction est inséré à la
place de son appel. Par exemple, avec un (très) vilain assembleur, la
ligne total += mafonction(i) donnerait sans inline :
push [i]
call _mafonction
pop ebx
add [total], eax
_mafonction:
mov eax, [bp +/- ..] ;; me souvient plus
mul eax, eax
dec eax
ret
Alors qu'avec inline, on aurait
mov eax, [i]
mul eax, eax
dec eax
add [total], eax
On est passe de 8 instructions à 4 et on supprime un call.
Le linker ne peux pas résoudre le lien car on a dit au compilateur que
dans l'unité de compilation (f1.cpp) la fonction est inline, donc ne
génère pas de code.
Pour que mon exemple fonctionne, il y a deux possibilités :
1)
dans f1.h
inline int mafonction(const int x) {
return x * x - 1;
}
dans f1.cpp
virer le code de mafonction
2) si mafonction n'est utilisée que dans f2.c
virer tout dans f1.h et f1.cpp et faire :
inline int mafonction(const int x) {
return x * x - 1;
}
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}Est ce que c'est "propre" de faire ca ?
Faut faire attentiontous les commentaires m'interessent, merci ;))
Voilà ce que je sais.
Bernard.
bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans
les fichier en-tête.
non
Visiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte
les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans f2.cpp.
'inline', ça veut dire que le code généré de la fonction est inséré à la
place de son appel. Par exemple, avec un (très) vilain assembleur, la
ligne total += mafonction(i) donnerait sans inline :
push [i]
call _mafonction
pop ebx
add [total], eax
_mafonction:
mov eax, [bp +/- ..] ;; me souvient plus
mul eax, eax
dec eax
ret
Alors qu'avec inline, on aurait
mov eax, [i]
mul eax, eax
dec eax
add [total], eax
On est passe de 8 instructions à 4 et on supprime un call.
Le linker ne peux pas résoudre le lien car on a dit au compilateur que
dans l'unité de compilation (f1.cpp) la fonction est inline, donc ne
génère pas de code.
Pour que mon exemple fonctionne, il y a deux possibilités :
1)
dans f1.h
inline int mafonction(const int x) {
return x * x - 1;
}
dans f1.cpp
virer le code de mafonction
2) si mafonction n'est utilisée que dans f2.c
virer tout dans f1.h et f1.cpp et faire :
inline int mafonction(const int x) {
return x * x - 1;
}
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Est ce que c'est "propre" de faire ca ?
Faut faire attention
tous les commentaires m'interessent, merci ;))
Voilà ce que je sais.
Bernard.
bonjour,
je pensais que le mot clef "inline" ne s'utilisait uniquement que dans
les fichier en-tête.
nonVisiblement ce n'est pas le cas, le compilateur ( MSVC++2003 ) accepte
les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la compilation du
code, si ces fonctions sont situées dans le .h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans f2.cpp.
'inline', ça veut dire que le code généré de la fonction est inséré à la
place de son appel. Par exemple, avec un (très) vilain assembleur, la
ligne total += mafonction(i) donnerait sans inline :
push [i]
call _mafonction
pop ebx
add [total], eax
_mafonction:
mov eax, [bp +/- ..] ;; me souvient plus
mul eax, eax
dec eax
ret
Alors qu'avec inline, on aurait
mov eax, [i]
mul eax, eax
dec eax
add [total], eax
On est passe de 8 instructions à 4 et on supprime un call.
Le linker ne peux pas résoudre le lien car on a dit au compilateur que
dans l'unité de compilation (f1.cpp) la fonction est inline, donc ne
génère pas de code.
Pour que mon exemple fonctionne, il y a deux possibilités :
1)
dans f1.h
inline int mafonction(const int x) {
return x * x - 1;
}
dans f1.cpp
virer le code de mafonction
2) si mafonction n'est utilisée que dans f2.c
virer tout dans f1.h et f1.cpp et faire :
inline int mafonction(const int x) {
return x * x - 1;
}
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}Est ce que c'est "propre" de faire ca ?
Faut faire attentiontous les commentaires m'interessent, merci ;))
Voilà ce que je sais.
Bernard.
"Jean-Marc Bourguet" a écrit dans le message de news:"Geoffrey" writes:je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le
compilateur ignore totalement ce qui vient ou pas des
en-tetes.
donc finalement bien que le compilo ne dis rien sur la
presence des inline, finalement s'ils ne seraient pas la,
ce serait pareil ???
"Jean-Marc Bourguet" <jm@bourguet.org> a écrit dans le message de news:
pxb64ve7su4.fsf@news.bourguet.org...
"Geoffrey" <gbaudin2@wanadoo.fr> writes:
je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le
compilateur ignore totalement ce qui vient ou pas des
en-tetes.
donc finalement bien que le compilo ne dis rien sur la
presence des inline, finalement s'ils ne seraient pas la,
ce serait pareil ???
"Jean-Marc Bourguet" a écrit dans le message de news:"Geoffrey" writes:je pensais que le mot clef "inline" ne s'utilisait uniquement que
dans les fichier en-tête.
Pourquoi ? Apres la phase de pre-processing, le
compilateur ignore totalement ce qui vient ou pas des
en-tetes.
donc finalement bien que le compilo ne dis rien sur la
presence des inline, finalement s'ils ne seraient pas la,
ce serait pareil ???
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Il me "semble" que dans les options de compilation, il y a une case pour lui
indiquer d'utiliser réellemnt les inline ... à moins que ce soit le fait de
compiler en debug ou pas !!!
d'ailleurs si quelqu'un sait comment obliger le malloc de VisualC++ à
renvoyer une zone remplies de 0 en mode debug ? çà m'intéresse !
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Il me "semble" que dans les options de compilation, il y a une case pour lui
indiquer d'utiliser réellemnt les inline ... à moins que ce soit le fait de
compiler en debug ou pas !!!
d'ailleurs si quelqu'un sait comment obliger le malloc de VisualC++ à
renvoyer une zone remplies de 0 en mode debug ? çà m'intéresse !
Moi ce genre de code fonctionne !!! Aucune erreur de compilation ...
C'est bien pour ca que je posais la question ^^
Il me "semble" que dans les options de compilation, il y a une case pour lui
indiquer d'utiliser réellemnt les inline ... à moins que ce soit le fait de
compiler en debug ou pas !!!
d'ailleurs si quelqu'un sait comment obliger le malloc de VisualC++ à
renvoyer une zone remplies de 0 en mode debug ? çà m'intéresse !
je pensais que le mot clef "inline" ne s'utilisait
uniquement que dans les fichier en-tête.
nonVisiblement ce n'est pas le cas, le compilateur ( MSVC++2003
) accepte les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la
compilation du code, si ces fonctions sont situées dans le
.h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans
f2.cpp.
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
je pensais que le mot clef "inline" ne s'utilisait
uniquement que dans les fichier en-tête.
non
Visiblement ce n'est pas le cas, le compilateur ( MSVC++2003
) accepte les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la
compilation du code, si ces fonctions sont situées dans le
.h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans
f2.cpp.
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
je pensais que le mot clef "inline" ne s'utilisait
uniquement que dans les fichier en-tête.
nonVisiblement ce n'est pas le cas, le compilateur ( MSVC++2003
) accepte les fonctions "inline" dans le fichier cpp.
Ma question est : est-ce que cela a une influence sur la
compilation du code, si ces fonctions sont situées dans le
.h ou le .cpp ???
oui
Dans un f1.h :
int mafonction(const int x);
Dans le f1.cpp
#include "f1.h"
inline int mafonction(const int x) {
return x * x - 1;
}
dans f2.cpp
#include "f1.h"
int main() {
int total = 0;
for (int i=0; i<10; i++)
total += mafonction(i);
}
Le linker ne peut pas résoudre le symbole 'mafonction' dans
f2.cpp.
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
P't-êt' ben qu'oui. Si une fonction est déclarée inline à un
endroit, il faut qu'elle soit déclarée inline à chaque
utilisation. Ici, ce n'est pas le cas. Mais c'est un
comportement indéfini, et j'imagine qu'il y a bien des cas où il
fonctionne -- pour diverses raisons, beaucoup de compilateurs
ignore l'inline s'il compile sans optimisation, par exemple.
Il y a quelques jours, à la suite d'un copier/coller trop rapide, j'ai
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
P't-êt' ben. La norme ne dit que c'est une « suggestion » au
compilateur que tous les endroits où la fonction est appelée
sont critiques. Ensuite, c'est au compilateur de décider.
Typiquement : si on est en mode debug, le compilateur va ignorer
le inline ; il ne génèrera du code inline que dans la contexte
de l'optimisation. Et il existe des compilateurs (pas très
courant, j'avoue), dont l'optimisateur sait mieux faire pour ce
qui doit être inline que le programmeur -- ils ignorent aussi
l'inline déclaré, pour mettre ce qu'ils trouvent bien inline.
On est d'accord, en particulier lorsque la fonction contient une boucle
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Bernard
P't-êt' ben qu'oui. Si une fonction est déclarée inline à un
endroit, il faut qu'elle soit déclarée inline à chaque
utilisation. Ici, ce n'est pas le cas. Mais c'est un
comportement indéfini, et j'imagine qu'il y a bien des cas où il
fonctionne -- pour diverses raisons, beaucoup de compilateurs
ignore l'inline s'il compile sans optimisation, par exemple.
Il y a quelques jours, à la suite d'un copier/coller trop rapide, j'ai
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
P't-êt' ben. La norme ne dit que c'est une « suggestion » au
compilateur que tous les endroits où la fonction est appelée
sont critiques. Ensuite, c'est au compilateur de décider.
Typiquement : si on est en mode debug, le compilateur va ignorer
le inline ; il ne génèrera du code inline que dans la contexte
de l'optimisation. Et il existe des compilateurs (pas très
courant, j'avoue), dont l'optimisateur sait mieux faire pour ce
qui doit être inline que le programmeur -- ils ignorent aussi
l'inline déclaré, pour mettre ce qu'ils trouvent bien inline.
On est d'accord, en particulier lorsque la fonction contient une boucle
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Bernard
P't-êt' ben qu'oui. Si une fonction est déclarée inline à un
endroit, il faut qu'elle soit déclarée inline à chaque
utilisation. Ici, ce n'est pas le cas. Mais c'est un
comportement indéfini, et j'imagine qu'il y a bien des cas où il
fonctionne -- pour diverses raisons, beaucoup de compilateurs
ignore l'inline s'il compile sans optimisation, par exemple.
Il y a quelques jours, à la suite d'un copier/coller trop rapide, j'ai
'inline', ça veut dire que le code généré de la fonction est
inséré à la place de son appel.
P't-êt' ben. La norme ne dit que c'est une « suggestion » au
compilateur que tous les endroits où la fonction est appelée
sont critiques. Ensuite, c'est au compilateur de décider.
Typiquement : si on est en mode debug, le compilateur va ignorer
le inline ; il ne génèrera du code inline que dans la contexte
de l'optimisation. Et il existe des compilateurs (pas très
courant, j'avoue), dont l'optimisateur sait mieux faire pour ce
qui doit être inline que le programmeur -- ils ignorent aussi
l'inline déclaré, pour mettre ce qu'ils trouvent bien inline.
On est d'accord, en particulier lorsque la fonction contient une boucle
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Bernard
Cela dit, je pense qu'en full debug et en -O0 (pas
d'optimisation du tout), je pense, mais je n'ai pas testé, que
les compilateurs récents ne font pas de l'inline, mais qu'ils
font du static, d'où des problèmes à l'édition des liens.
J'étais persuadé que le compilateur remplaçait inline par
static lorsqu'il ne pouvait pas faire autrement, mais quelques
tests m'ont prouvé le contraire. Et je ne peux pas donner de
règle bien définie sur les choix du compilateur, même avec les
options -O0 -g3.
PS : P't-êt' ben qu'oui, t'es donc normand?
Cela dit, je pense qu'en full debug et en -O0 (pas
d'optimisation du tout), je pense, mais je n'ai pas testé, que
les compilateurs récents ne font pas de l'inline, mais qu'ils
font du static, d'où des problèmes à l'édition des liens.
J'étais persuadé que le compilateur remplaçait inline par
static lorsqu'il ne pouvait pas faire autrement, mais quelques
tests m'ont prouvé le contraire. Et je ne peux pas donner de
règle bien définie sur les choix du compilateur, même avec les
options -O0 -g3.
PS : P't-êt' ben qu'oui, t'es donc normand?
Cela dit, je pense qu'en full debug et en -O0 (pas
d'optimisation du tout), je pense, mais je n'ai pas testé, que
les compilateurs récents ne font pas de l'inline, mais qu'ils
font du static, d'où des problèmes à l'édition des liens.
J'étais persuadé que le compilateur remplaçait inline par
static lorsqu'il ne pouvait pas faire autrement, mais quelques
tests m'ont prouvé le contraire. Et je ne peux pas donner de
règle bien définie sur les choix du compilateur, même avec les
options -O0 -g3.
PS : P't-êt' ben qu'oui, t'es donc normand?