OVH Cloud OVH Cloud

méthode inline virtuelle

15 réponses
Avatar
MGN
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

10 réponses

1 2
Avatar
Fabien LE LEZ
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".


--
;-)

Avatar
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".


--
;-)



Avatar
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 ?

Avatar
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

Avatar
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

Avatar
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

Avatar
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


Avatar
MGN
Merci pour vos réponses.
Avatar
Samuel Krempp
le Thursday 07 April 2005 15:19, é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.

--
Sam


Avatar
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


1 2