IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Apprendre à programmer avec C++14 et C++17 pour des codes plus rapides et performants [Tutoriel]


Sujet :

C++

  1. #1
    Community Manager

    Profil pro
    Inscrit en
    Avril 2014
    Messages
    4 207
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2014
    Messages : 4 207
    Points : 13 061
    Points
    13 061
    Par défaut Apprendre à programmer avec C++14 et C++17 pour des codes plus rapides et performants
    Chers membres du club,

    J'ai le plaisir de vous présenter ce tutoriel de Dan Levin pour vous apprendre à rendre vos codes plus rapides (performants) avec C++14 et C++17.

    L'écriture de codes performants est toujours une tâche difficile. L'application directe des algorithmes théoriques « purs » n'est pas toujours suffisante dans les architectures du monde réel.

    Lorsqu'on a commencé à améliorer la rapidité de ces algorithmes purs, on se trouve rapidement confronté à un dilemme : certaines implémentations s'avèrent relativement rapides sur une architecture, mais effroyablement lentes sur d'autres. Dans le même temps, dans certains contextes, une nouvelle implémentation va dépasser les performances de la première, mais perdre de la vitesse dans tous les autres.

    De nombreuses optimisations, grandes et petites, pour chacune des architectures prises en charge peuvent rapidement faire gonfler notre code et nous faire perdre du temps. Souvent, nous sommes donc ramenés à choisir entre deux options : un beau code trop lent, ou bien un code rapide mais illisible.
    Bonne lecture .



    Retrouvez les meilleurs cours et tutoriels pour apprendre la programmation C++
    Pour contacter les différents services du club (publications, partenariats, publicité, ...) : Contacts

  2. #2
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 691
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 691
    Points : 20 222
    Points
    20 222
    Par défaut
    Alors je suis pas expert dans le domaine mais quand je lit ça :

    Le code précédent est équivalent à ce code, écrit en C++03 ou bien C++11 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    switch(log2n)
    {
    case 1:
        add_stage<internal::fft_specialization_t<T, 1, false>::template type>(size, type);
        break;
    case 2:
        add_stage<internal::fft_specialization_t<T, 2, false>::template type>(size, type);
        break;
    case 3:
        add_stage<internal::fft_specialization_t<T, 3, false>::template type>(size, type);
        break;
    case 4:
        add_stage<internal::fft_specialization_t<T, 4, false>::template type>(size, type);
        break;
    case 5:
        add_stage<internal::fft_specialization_t<T, 5, false>::template type>(size, type);
        break;
    case 6:
        add_stage<internal::fft_specialization_t<T, 6, false>::template type>(size, type);
        break;
    case 7:
        add_stage<internal::fft_specialization_t<T, 7, false>::template type>(size, type);
        break;
    case 8:
        add_stage<internal::fft_specialization_t<T, 8, false>::template type>(size, type);
        break;
    default:
        if(is_even(log2n))
        {
            make_fft(size, type, cbool<true>, ctrue);
            add_stage<internal::fft_reorder_stage_impl_t<T, true>::template type>(size, type);
        }
        else
        {
            make_fft(size, type, cbool<false>, ctrue);
            add_stage<internal::fft_reorder_stage_impl_t<T, false>::template type>(size, type);    
        }
    }
    Je me dis que j'aurais plutôt fait un truc comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if(log2n >= 1 && log2n <= 8) {
        add_stage<internal::fft_specialization_t<T, log2n, false>::template type>(size, type);
    } else {
        bool isEven = is_even(log2n);
        make_fft(size, type, cbool<isEven>, ctrue);
        add_stage<internal::fft_reorder_stage_impl_t<T, isEven>::template type>(size, type);
    }
    Donc soit j'ai pas compris une subtilité , soit l'auteur original y met un peu de mauvaise fois histoire d'appuyer un peu plus son article
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    log2n est une variable dynamique. Tu ne peux pas l'utiliser directement comme paramètre template sans passer par un dispatching à coups de switch ou autre.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 071
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 071
    Points : 12 116
    Points
    12 116
    Par défaut
    C'est l'une des différences entre les Template C++ et les génériques JAVA.
    Les templates sont compilés et optimisés au moment de la compilation.
    En JAVA, ce n'est qu'un modèle de code qui est généré à la compilation lors de la génération d'un générique.

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    rectification, en java, ce n'est pas un modèle, c'est une seule classe/fonction, utilisant Object, et l'utilisation est compilée (en byte code) à grand renfort de cast.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 518
    Points
    41 518
    Par défaut
    Par contre, en C#...

    En revanche, il y a des limitations: Pas de SFINAE, pas de génériques sur des valeurs (seulement des types), etc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 87
    Points
    87
    Par défaut Je suis débutant mais
    Super article mais... je n'ai rien compris du code, c'est grave ? personnellement j'aurais fais des pointeurs sur fonctions, mais je suis surement passé à côté d'un truc absolument pas de mon niveau, déjà que j'ai pas compris à quoi servait l'algorithme...

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Simple : à générer à la compilation 1 et 1 seul "algo" à chaque appel, dans ton code, de make_fft.

    Donc toi tu auras des pointeurs (unsafe + déférencement), là tu auras une grosse boucle + 2-3 subtilités comme des trucs "en dur" (du moins je le pense parce que je n'ai pas vu l'algo )

  9. #9
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 87
    Points
    87
    Par défaut
    c'est quoi le problème avec des pointeurs ? générer à la compilation ?? j'abandonne, trop fort pour moi

  10. #10
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,
    Citation Envoyé par Oscar.STEFANINI Voir le message
    c'est quoi le problème avec des pointeurs ?
    Le problème des pointeurs, c'est qu'on les associe régulièrement avec l'allocation dynamique de mémoire (new ou new[]) et que, pour éviter les fuites mémoire, il faut penser à libérer cette mémoire à coup de delete (ou delete[]).

    Mais, si allocation dynamique de mémoire il y a, encore faut il trouver "juste le bon moment" pour la libérer :
    Tropt tôt, on risque de vouloir accéder à l'adresse mémoire représentée par le pointeur alors qu'elle a été libérée,
    trop tard, on coure le risque d'avoir déjà perdu l'adresse mémoire représentée par le pointeur, et nous ne pourrons donc plus la libérer --> fuite mémoire.

    De plus, il faut savoir que C++ est un langage à exception, et que ca complique encore le fait de décider que "c'est juste le bon moment" pour libérer la mémoire

    Mais on a des outils très sympa pour éviter la plupart de ces problèmes : les pointeurs intelligents. Lorsqu'on les utilise, on peut assez facilement garantir que la mémoire allouée à un pointeur sera détruite... strictement au moment opportun.

    Enfin, un pointeur peut aussi représenter une valeur particulière (nullptr) qui représente explicitement le fait que l'adresse représentée est invalide. Pour manipuler sereinement des pointeurs, la première chose à faire est... de s'assurer que l'adresse représentée est valide, et ca, ca demande du code et du temps à l'exécution.

    C'est la raison pour laquelle on préfère généralement avoir recours aux références à chaque fois que faire se peut, car elles fournissent une garantie de "non nullité" (l'objet référencé existe forcément lorsque la référence est créée)
    générer à la compilation ?? j'abandonne, trop fort pour moi
    Pour faire simple : entre le code que tu écris et l'exécutable que tu lances, il y a deux étapes (en fait, il y en a plus, mais ces deux là sont suffisantes pour comprendre le fonctionnement):
    • la compilation proprement dite : le compilateur génère du "code binaire exécutable" (souvent appelé "code objet")
    • l'édition de liens : un outil appelé "éditeur de liens" reprend tous les "codes objets" générés par le compilateur, ainsi que celui utilisé qu'il trouve dans les bibliothèques pour créer l'exécutable final.

    Généré à la compilation représente donc "tout ce qui est fait durant la compilation", pour faire la distinction avec "ce qui est fait lorsque l'application est exécutée". Et le compilateur peut faire énormément de choses qui permettront au code objet (et donc à l'exécutable final) d'être "plus performant".
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  11. #11
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 87
    Points
    87
    Par défaut
    Merci pour les explications, même si en fait les pointeurs j'en fait pendant 1 année non stop (mon école m'a fait faire du C pendant 1 an). J'ai pas encore eu le temps de regarder les pointeurs intelligents, mais c'est vrai que j'aime bien les références (d'ailleurs j'ai une question, est-ce que passer une référence à une fonction c'est aussi léger que passer un pointeur ?).

    D'accord !! en gros c'est juste du code optimisé... Pour la compilation et du coup pour l’exécution ? ce qui finalement.. correspond au titre de l'article !

    En fait j'ai mal interprété le message précédent, voilà tout merci !

  12. #12
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    En C++ par défaut on utilise pas de pointeurs, et on passe les données soit par référence ou par copie, sachant qu'il existe des "référence const" qui ne évitent les copies inutiles.

    On utilise les pointeurs quand on sait vraiment que l'on en a besoin, et dans ce cas là, on les encapsulera dans des pointeurs intelligents. En gros on utilise des pointeurs mais sans jamais écrire de new ni de delete (à partir de C++14).

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Citation Envoyé par nikko34 Voir le message
    ... En gros on utilise des pointeurs mais sans jamais écrire de new ni de delete (à partir de C++14).
    Ne découvrant que depuis pas longtemps ce qu'on nous propose depuis C++11 (et suivant), quelles sont les fonctionalités nous permettant d'allouer dans le heap sans faire de new ?

  14. #14
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par camboui Voir le message
    Ne découvrant que depuis pas longtemps ce qu'on nous propose depuis C++11 (et suivant), quelles sont les fonctionalités nous permettant d'allouer dans le heap sans faire de new ?
    Regarde ici: Gestion dynamique de la mémoire

    Je retire la partie commentée, parce que koala01 a sorti du bois: il a fait sa grosse réponse très précise et il a pris ces 3 points "as usual"

  15. #15
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    auto wPtr = std::make_unique< Widget >();
    Sans "écrire" de new, mais ça en fera un.

    Après, hors polymorphisme dynamique et cas spéciaux, par défaut tu dois faire:


  16. #16
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    l'ancien "auto_ptr" a la propriété de lacher facilement la propriété d'un pointé.
    Notamment, en argument de fonction, le pointeur de l'appeleur perd la propriété.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 176
    Points
    1 176
    Par défaut
    auto_ptr n'existe plus (il était mal fait et ne devait pas être utilisé dans les containers par ex.) Maintenant c'est std::unique_ptr et std::shared_ptr.

  18. #18
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Citation Envoyé par Oscar.STEFANINI Voir le message
    Merci pour les explications, même si en fait les pointeurs j'en fait pendant 1 année non stop (mon école m'a fait faire du C pendant 1 an). J'ai pas encore eu le temps de regarder les pointeurs intelligents, mais c'est vrai que j'aime bien les références (d'ailleurs j'ai une question, est-ce que passer une référence à une fonction c'est aussi léger que passer un pointeur ?).
    Oui, tout à fait... En fait, si tu regarde au niveau du code binaire généré (ou au niveau du code assembleur généré), tu te rendra compte qu'une référence est transmise exactement comme s'il s'agissait d'un pointeur: c'est l'adresse mémoire à laquelle se trouve la donnée qui est transmise

    La seule différence entre les deux, c'est que le langage (et donc le compilateur) est beaucoup plus permissif en ce qui concerne les pointeurs : on peut changer la valeur de l'adresse mémoire qu'ils reprsentent, et il peuvent représenter une adresse invalide (nullptr), alors que les références doivent être définies une bonne fois pour toute à la création, et qu'elle doivent référencer un objet qui existe lorsqu'elles sont créées.
    Citation Envoyé par foetus
    • unique_ptr<> -> new/ delete
    • weak_ptr<> -> XXX& ou const XXX& ou [XXX* ou const XXX*]
    • shared_ptr -> je ne sais trop, mais je dirais reference counting + une liste de weak_ptr<>
    • auto_ptr<> -> new/ delete mais le "avec sémantique stricte propriété de l'objet" semble dire copie/ transfert interdits
    Humm...
    • unique_ptr<> (new/new[] delete/delete[](make_unique depuis C++14))
      1. unique responsable (propriétaire) du pointeur qui lui est confié
      2. copie et affectation interdites,
      3. copie par déplacement et affectation par déplacement autorisées
      4. possibilité de changer le pointeur sous jacent (la mémoire allouée au pointeur sous-jacent est alors automatiquement libérée) : reset
      5. possibilité de forcer la libération du pointeur sous jascent : reset
      6. possibilité de récupérer la responsabilité du pointeur sous jascent release
      7. possibilité de récupérer le pointeur sous jascent (sans libérer unique_ptr de la responsabilité) : opérateurs * et ->, get
    • shared_ptr<> (new/new[] delete/delete[](make_shared depuis C++11)) :
      1. plusieurs responsables / propriétaires du pointeur qui lui est confié(le dernier shared_ptr à référencer le pointeur s'occupe de la libération de la mémoire)
      2. copie et affectation autorisée
      3. copie par déplacement et affectation par déplacement autorisées
      4. possibilité de connaitre le nombre de références associées au pointeur sous-jacent : use_count
      5. possiblité d'obtenir un shared_ptr (voir plus loin)
      6. possibilité de modifier le pointeur sous jacent (reset)
      7. possibilité de forcer la libération du pointeur sous jacent (reset)
      8. possibilité de savoir si le pointeur sous jacent est toujours valide (operator bool)
    • weak_ptr<> (à partir d'un shared_ptr)
      1. transmet un pointeur partagé sans intervenir dans le comptage de référence (n'intervient pas dans le processus de libération de la mémoire)
      2. copie et affectation autorisées
      3. copie par déplacement et affectation par déplacement autorisées
      4. ne permet d'accéder au pointeur sous jacent qu'en créant un nouveau shared_ptr (lock)
      5. permet de connaire le nombre de références associées au pointeur sous jacent (use_count)
      6. permet de savoir si le pointeur sous-jacen n'est plus valide (expired)
    • auto_ptr<> (déprécié en C++11, supprimé en C++14)
      1. la sauce n'a jamais vraiment pris
      2. posait pas mal de problèmes, trop long à citer ici

    tous les pointeurs intelligents fournissent les opérateurs de comparaison

    A noter que C++11 date déjà de plus de cinq ans et que, depuis, C++14 est sortie (déjà depuis près de trois ans)... Cette dernière norme apporte apporte pas mal de nouveautés supplémentaires, et devrait être "la norme par défaut" utilisée, en remplacement de C++11
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  19. #19
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2016
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 42
    Points : 87
    Points
    87
    Par défaut
    visiblement j'ai posé une bonne question

  20. #20
    Membre expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Points : 3 156
    Points
    3 156
    Par défaut
    Hello

    J'ajouterais une propriété intéressante de shared_ptr: il est thread safe tant que chaque thread possède son shared_ptr. Le comptage de référence est implémenté avec des atomics.
    Find me on github

Discussions similaires

  1. Réponses: 6
    Dernier message: 22/06/2017, 19h28
  2. Réponses: 3
    Dernier message: 16/01/2015, 00h21
  3. tutoriel pour apprendre à utiliser jquery, ajax. . .
    Par benja507 dans le forum jQuery
    Réponses: 1
    Dernier message: 17/10/2008, 17h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo