bonjour,
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des
méthodes virtuelles inline.
A la réflexion, je me demande si c'est stupide. Mon compilo ne dit rien mais
les méthodes étant déclarées virtuelles (et elles le sont dans la pratique),
je vois mal comment elles pourraient être inline.
Quel est votre avis ?
Marc
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
-- ;-)
On Thu, 7 Apr 2005 14:02:13 +0200, "MGN" <mgueguen@metrica.fr>:
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des
méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au
compilateur, rien de plus.
Le compilateur a le droit de mettre une fonction inline de son propre
chef, tout comme il a le droit d'ignorer le mot "inline".
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
-- ;-)
Ahmed MOHAMED ALI
Bonjour,
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
C'est vrai que le compilateur peut l'ignorer mais dans ce cas,la taille du code augmentera puisque chaque unité de traduction aura sa propre copie statique de la fonction.Il vaut donc mieux faire attention à l'utilisation de inline.D'autant plus que la plupart des implémentations initialise une vtable avec des pointeurs sur les fonctions et dans ce cas la fonction ne peut pas être inline sinon on ne peut pas obtenir son adresse.
Ahmed
"Fabien LE LEZ" wrote in message news:
On Thu, 7 Apr 2005 14:02:13 +0200, "MGN" :
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
-- ;-)
Bonjour,
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des
méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au
compilateur, rien de plus.
Le compilateur a le droit de mettre une fonction inline de son propre
chef, tout comme il a le droit d'ignorer le mot "inline".
C'est vrai que le compilateur peut l'ignorer mais dans ce cas,la taille du
code augmentera puisque chaque unité de traduction
aura sa propre copie statique de la fonction.Il vaut donc mieux faire
attention à l'utilisation de inline.D'autant plus que
la plupart des implémentations initialise une vtable avec des pointeurs sur
les fonctions et dans ce cas la fonction ne peut pas être inline
sinon on ne peut pas obtenir son adresse.
Ahmed
"Fabien LE LEZ" <gramster@gramster.com> wrote in message
news:ch8a51p0tnfqoid65be7nodvs04ui33gq3@4ax.com...
On Thu, 7 Apr 2005 14:02:13 +0200, "MGN" <mgueguen@metrica.fr>:
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des
méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au
compilateur, rien de plus.
Le compilateur a le droit de mettre une fonction inline de son propre
chef, tout comme il a le droit d'ignorer le mot "inline".
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
C'est vrai que le compilateur peut l'ignorer mais dans ce cas,la taille du code augmentera puisque chaque unité de traduction aura sa propre copie statique de la fonction.Il vaut donc mieux faire attention à l'utilisation de inline.D'autant plus que la plupart des implémentations initialise une vtable avec des pointeurs sur les fonctions et dans ce cas la fonction ne peut pas être inline sinon on ne peut pas obtenir son adresse.
Ahmed
"Fabien LE LEZ" wrote in message news:
On Thu, 7 Apr 2005 14:02:13 +0200, "MGN" :
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline.
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
-- ;-)
MGN
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Tu as mis le mot-clé "inline", ce qui donne une indication au
compilateur, rien de plus.
Le compilateur a le droit de mettre une fonction inline de son propre
chef, tout comme il a le droit d'ignorer le mot "inline".
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une
méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Vincent Lascaux
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître le type de l'objet. Donc si tu fais struct A { inline virtual void foo() { std::cout << "A"; } }; struct B : public A { void foo() { std::cout << "B"; } };
int main() { A a; a.foo(); }
Il y a des chances que ca soit inliné
-- Vincent
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une
méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître le type
de l'objet.
Donc si tu fais
struct A { inline virtual void foo() { std::cout << "A"; } };
struct B : public A { void foo() { std::cout << "B"; } };
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître le type de l'objet. Donc si tu fais struct A { inline virtual void foo() { std::cout << "A"; } }; struct B : public A { void foo() { std::cout << "B"; } };
int main() { A a; a.foo(); }
Il y a des chances que ca soit inliné
-- Vincent
Vincent Lascaux
int main() { A * a = new B; a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B et inliner la fonction, non ? Ca me parait de toutes façons assez difficile pour que les compilos qui y arrivent soient suffisamment avancés pour ne pas tenir compte de l'indicateur "inline"...
-- Vincent
int main()
{
A * a = new B;
a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B et
inliner la fonction, non ?
Ca me parait de toutes façons assez difficile pour que les compilos qui y
arrivent soient suffisamment avancés pour ne pas tenir compte de
l'indicateur "inline"...
int main() { A * a = new B; a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B et inliner la fonction, non ? Ca me parait de toutes façons assez difficile pour que les compilos qui y arrivent soient suffisamment avancés pour ne pas tenir compte de l'indicateur "inline"...
-- Vincent
Aurélien REGAT-BARREL
MGN wrote:
bonjour, j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline. A la réflexion, je me demande si c'est stupide. Mon compilo ne dit rien mais les méthodes étant déclarées virtuelles (et elles le sont dans la pratique), je vois mal comment elles pourraient être inline. Quel est votre avis ?
Je pense que ça peut avoir un sens dans le cas d'une utilisation non virtuelle de ta fonction (je sais pas comment on dit):
class A { public: inline virtual void Test() { std::cout << "A::Test()n"; } };
class B : public A { public: inline virtual void Test() { std::cout << "B::Test()n"; } };
int main() { A * a = new B; a->Test(); // inline ignoré a->A::Test(); // inline éventuellement pris en compte }
-- Aurélien REGAT-BARREL
MGN wrote:
bonjour,
j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des
méthodes virtuelles inline.
A la réflexion, je me demande si c'est stupide. Mon compilo ne dit
rien mais les méthodes étant déclarées virtuelles (et elles le sont
dans la pratique), je vois mal comment elles pourraient être inline.
Quel est votre avis ?
Je pense que ça peut avoir un sens dans le cas d'une utilisation non
virtuelle de ta fonction (je sais pas comment on dit):
class A
{
public:
inline virtual void Test()
{
std::cout << "A::Test()n";
}
};
class B : public A
{
public:
inline virtual void Test()
{
std::cout << "B::Test()n";
}
};
int main()
{
A * a = new B;
a->Test(); // inline ignoré
a->A::Test(); // inline éventuellement pris en compte
}
bonjour, j'ai fait une hiérarchie de classes et par habitude j'ai déclaré des méthodes virtuelles inline. A la réflexion, je me demande si c'est stupide. Mon compilo ne dit rien mais les méthodes étant déclarées virtuelles (et elles le sont dans la pratique), je vois mal comment elles pourraient être inline. Quel est votre avis ?
Je pense que ça peut avoir un sens dans le cas d'une utilisation non virtuelle de ta fonction (je sais pas comment on dit):
class A { public: inline virtual void Test() { std::cout << "A::Test()n"; } };
class B : public A { public: inline virtual void Test() { std::cout << "B::Test()n"; } };
int main() { A * a = new B; a->Test(); // inline ignoré a->A::Test(); // inline éventuellement pris en compte }
-- Aurélien REGAT-BARREL
Aurélien REGAT-BARREL
Vincent Lascaux wrote:
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître le type de l'objet. Donc si tu fais struct A { inline virtual void foo() { std::cout << "A"; } }; struct B : public A { void foo() { std::cout << "B"; } };
int main() { A a; a.foo(); }
Il y a des chances que ca soit inliné
Peut être que quand il est capable de faire l'appel de fonction virtuelle sans passer par la vtable (ce qui ne dépend pas du mot-clé inline), alors il peut en plus inliner la fonction (ce qui peut en dépendre). Autrement dit, s'il est assez intelligent pour optimiser ton exemple de cette manière:
int main() { A a; a.A::foo(); }
Alors il peut en plus effectuer de l'inlining.
-- Aurélien REGAT-BARREL
Vincent Lascaux wrote:
Je sais, mais il me parait inutile d'écrire "inline virtual" devant
une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître
le type de l'objet.
Donc si tu fais
struct A { inline virtual void foo() { std::cout << "A"; } };
struct B : public A { void foo() { std::cout << "B"; } };
int main() { A a; a.foo(); }
Il y a des chances que ca soit inliné
Peut être que quand il est capable de faire l'appel de fonction virtuelle
sans passer par la vtable (ce qui ne dépend pas du mot-clé inline), alors il
peut en plus inliner la fonction (ce qui peut en dépendre).
Autrement dit, s'il est assez intelligent pour optimiser ton exemple de
cette manière:
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Elle peut être inlinée dans un cas où le compilo arrive à connaître le type de l'objet. Donc si tu fais struct A { inline virtual void foo() { std::cout << "A"; } }; struct B : public A { void foo() { std::cout << "B"; } };
int main() { A a; a.foo(); }
Il y a des chances que ca soit inliné
Peut être que quand il est capable de faire l'appel de fonction virtuelle sans passer par la vtable (ce qui ne dépend pas du mot-clé inline), alors il peut en plus inliner la fonction (ce qui peut en dépendre). Autrement dit, s'il est assez intelligent pour optimiser ton exemple de cette manière:
int main() { A * a = new B; a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B et inliner la fonction, non ? Ca me parait de toutes façons assez difficile pour que les compilos qui y arrivent soient suffisamment avancés pour ne pas tenir compte de l'indicateur "inline"...
c'est pas évident. avec inline, la définition de la fonction visible de toute unité de compilation. Si un compilateur optimise très intelligemment mais sans avoir la possibilité de travailler au moment du link, le mot-clef inline pourra être utile.
-- Sam
le Thursday 07 April 2005 15:19, nospam@nospam.org écrivit :
int main()
{
A * a = new B;
a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B
et inliner la fonction, non ?
Ca me parait de toutes façons assez difficile pour que les compilos qui y
arrivent soient suffisamment avancés pour ne pas tenir compte de
l'indicateur "inline"...
c'est pas évident.
avec inline, la définition de la fonction visible de toute unité de
compilation. Si un compilateur optimise très intelligemment mais sans avoir
la possibilité de travailler au moment du link, le mot-clef inline pourra
être utile.
int main() { A * a = new B; a->Test(); // inline ignoré
Ici, le compilo peut être assez intelligent pour voir que a est de type B et inliner la fonction, non ? Ca me parait de toutes façons assez difficile pour que les compilos qui y arrivent soient suffisamment avancés pour ne pas tenir compte de l'indicateur "inline"...
c'est pas évident. avec inline, la définition de la fonction visible de toute unité de compilation. Si un compilateur optimise très intelligemment mais sans avoir la possibilité de travailler au moment du link, le mot-clef inline pourra être utile.
-- Sam
James Kanze
MGN wrote:
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Je ne sais pas. Moi, j'ai du mal à voir un contexte où inline virtual aurait un sens. Si tu donnes la définition de la fonction directement dans la classe, elle est forcément inline, que tu le dises ou non. Et si tu mets la définition en dehors de la classe, comme il se doit, la plupart des gens mettent l'inline sur la définition, où la virtual n'est même pas légal.
Et enfin, il y a une question importante qui reste. Que dit ton profiler ? Est-ce que le inline a apporté quelque chose ou non ? Parce que tu ne t'es certainement pas lancé à déclarer des choses inline sans que le profiler en a indiqué la nécessité.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
MGN wrote:
Tu as mis le mot-clé "inline", ce qui donne une indication au
compilateur, rien de plus.
Le compilateur a le droit de mettre une fonction inline de son
propre chef, tout comme il a le droit d'ignorer le mot
"inline".
Je sais, mais il me parait inutile d'écrire "inline virtual"
devant une méthode qui n'a aucune chance d'être inline... Où
je me trompe ?
Je ne sais pas. Moi, j'ai du mal à voir un contexte où inline
virtual aurait un sens. Si tu donnes la définition de la
fonction directement dans la classe, elle est forcément inline,
que tu le dises ou non. Et si tu mets la définition en dehors de
la classe, comme il se doit, la plupart des gens mettent
l'inline sur la définition, où la virtual n'est même pas légal.
Et enfin, il y a une question importante qui reste. Que dit ton
profiler ? Est-ce que le inline a apporté quelque chose ou non ?
Parce que tu ne t'es certainement pas lancé à déclarer des
choses inline sans que le profiler en a indiqué la nécessité.
--
James Kanze mailto: james.kanze@free.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
Tu as mis le mot-clé "inline", ce qui donne une indication au compilateur, rien de plus. Le compilateur a le droit de mettre une fonction inline de son propre chef, tout comme il a le droit d'ignorer le mot "inline".
Je sais, mais il me parait inutile d'écrire "inline virtual" devant une méthode qui n'a aucune chance d'être inline... Où je me trompe ?
Je ne sais pas. Moi, j'ai du mal à voir un contexte où inline virtual aurait un sens. Si tu donnes la définition de la fonction directement dans la classe, elle est forcément inline, que tu le dises ou non. Et si tu mets la définition en dehors de la classe, comme il se doit, la plupart des gens mettent l'inline sur la définition, où la virtual n'est même pas légal.
Et enfin, il y a une question importante qui reste. Que dit ton profiler ? Est-ce que le inline a apporté quelque chose ou non ? Parce que tu ne t'es certainement pas lancé à déclarer des choses inline sans que le profiler en a indiqué la nécessité.
-- James Kanze mailto: Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34