• [^] # Re: Les avantages de C++ ne sont pas bien différentes avec Rust

    Posté par (Mastodon) . En réponse à la dépêche Faut‐il continuer à apprendre le C++ ?. Évalué à 7. Dernière modification le 15 août 2018 à 18:39.

    Cet interfaçage demande à faire une couche de translation C ou C++98 vers C++11. Hors ces 3 langages sont presque totalement compatibles donc il est assez subtile de s'assurer que l'on ne leak pas du C dans le reste de ton programme. Une méthode C++98 qui te retourne un objet dont les méthodes manipulent des pointeurs nus. Tu va devoir proxifier l'ensemble de l'objet en tenant potentiellement compte de l'overhead que tu introduit (c'est important pour un langage dont l'un des principaux arguments c'est la performance).

    Là, tu racontes absolument n'importe quoi. Faire une surcouche C++ d'une bibliothèque en C, ça améliore la sûreté d'utilisation de la bibliothèque en C sans ajouter aucun overhead. Petit exemple, disons que j'ai une bibliothèque C avec des fonctions de ce genre:

    struct foo;
    struct foo *foo_create(int foo_param);
    void foo_delete(struct foo *f);
    void foo_do_something(const struct foo *f);

    Je fais ma surcouche de la manière suivante:

    class Foo {
    public:
     Foo(int foo_param)
     : m_f(foo_create(foo_param))
     {
     }
     ~Foo() {
     if (m_f) {
     foo_delete(m_f);
     }
     }
     // j'interdis les copies parce que l'API de base ne permet pas de copier l'objet
     Foo(Foo&) = delete;
     Foo& operator(Foo&) = delete;
     // j'autorise le transfert de propriété
     Foo(Foo&& other)
     : m_f(std::exchange(other.m_f, nullptr))
     {
     }
     Foo& operator=(Foo& other) {
     std::swap(m_f, other.m_f);
     }
     void doSomething() const {
     foo_do_something(m_f);
     }
    private:
     foo *m_f;
    };

    Comme tout va être inliné, je n'ai aucun overhead, et je m'assure que le destructeur fait bien son boulot dans tous les cas. Et du point de vue du programmeur C++, il n'y aucun pointeur venu du C à gérer, c'est totalement transparent.