Polymorphisme Dynamique vs. std::variant : Démystification des Mythes sur la Vitesse de std::visit

Analyse des idées reçues sur le polymorphisme dynamique et std::variant en C++.

5 min readProgrammation

Dans l'univers du C++ moderne, une idée répandue s'est installée : le polymorphisme dynamique traditionnel via des fonctions virtuelles est considéré comme obsolète et inefficace, notamment en ce qui concerne l'utilisation du cache CPU. Les défenseurs de std::variant et std::visit le présentent souvent comme une alternative supérieure. De nombreux articles en ligne affirment que std::visit permet une dispatching en temps constant O(1), rendant ainsi le paradigme de la programmation orientée objet obsolète. Cependant, ces comparaisons tombent souvent dans des pièges méthodologiques, opposant un vecteur de pointeurs (std::vector<Base*>) à un vecteur d'objets bruts (std::vector<std::variant>). Bien que std::variant semble l'emporter, cet avantage provient non pas des mécanismes d'appel de fonction, mais de la localité des données dans le cache CPU. Pour clarifier cela, nous devons égaliser les conditions et isoler les mécanismes d'appel. Considérons un scénario réaliste où les objets sont lourds, créés dynamiquement au fil du temps et dispersés dans le tas, tandis que nous opérons sur des tableaux de leurs adresses. Nous comparerons directement std::vector<Base*> et std::vector<std::variant<TypeA, TypeB, TypeC>*> dans des conditions de compilation séparée, où l'optimiseur ne peut pas appliquer l'inlining total.

Programmation