CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] Pimpl et interfaces

jenaipasdenom
jenaipasdenom
Niveau 15
03 juillet 2014 à 02:27:40

Salut à tous !

Alors voila une question qui me trotte dans la tête depuis quelque temps. On peut dissimuler l'implémentation d'une classe de plusieurs façons dont voici les deux exemples qui me viennent à l'esprit :

- Un pimpl classique :
class Foo
{
struct Impl;
std::unique_ptr<Impl> impl;

public:
Foo();
void FooFunc();
};

Dans le fichier source :

struct Foo::Impl
{
void FooFunc()
{
std::cout << "FOOOOOOOO" << std::endl;
}
};

Foo::Foo() : impl(new Foo::Impl){}

void Foo::FooFunc()
{
impl->FooFunc();
}

Une autre façon de faire pourrait être celle ci :

struct Foo
{
virtual ~Foo() = default;
virtual void FooFunc() = 0;
};

extern Foo *CreateFoo();

Et dans le fichier source :

struct FooImpl : public Foo
{
void FooFunc() override
{
std::cout << "FOOOOOOOO" << std::endl;
}
};

La question que je me pose est simple. Pour la deuxième façon de faire (en supposant qu'il n'y ait bien qu'une seule implémentation de l'interface Foo), paierait-on le prix d'un appel de fonction polymorphique ou bien le compilateur peut-il se "rendre compte" que sa vftable est ne comporte qu'une seule entrée et donc décider de faire des optimisations que des appels polymorphiques ne permettent normalement pas ?

godrik
godrik
Niveau 30
03 juillet 2014 à 04:56:06

Non le compilateur ne peux pas se rendre compte de ces choses la facilement. Donc probablement il ne le fait pas.
Rappelle toi bien, que si un truc a l'air compliquer. probablement le compilateur ne le voit pas.

jenaipasdenom
jenaipasdenom
Niveau 15
03 juillet 2014 à 07:16:27

Ok, c'est bien ce que je me disais. Merci pour ta réponse godrik !

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Macintosh
  • Hardware
La vidéo du moment