Maison > développement back-end > C++ > `std::make_shared` vs `std::shared_ptr` : lequel est le plus efficace ?

`std::make_shared` vs `std::shared_ptr` : lequel est le plus efficace ?

Barbara Streisand
Libérer: 2024-12-14 02:04:10
original
643 Les gens l'ont consulté

`std::make_shared` vs. `std::shared_ptr`: Which is More Efficient?

Discerner l'efficacité de std::make_shared vs Direct std::shared_ptr Utilisation

Comprendre la différence d'efficacité entre std::make_shared et construire directement un std : :shared_ptr peut être une tâche déroutante. Ici, nous approfondissons une comparaison détaillée pour élucider les subtilités de chaque méthode.

Exploration de la séquence de construction

Considérez les extraits de code suivants :

std::shared_ptr<Object> p1 = std::make_shared<Object>("foo");
std::shared_ptr<Object> p2(new Object("foo"));
Copier après la connexion

Direct std::shared_ptr Construction :

  1. Tas allocation pour Object
  2. Constructeur de pointeur partagé, allouant une autre région de tas pour les métadonnées

std::make_shared Utilisation :

  1. Combiné allocation de tas, englobant à la fois les objets et les métadonnées

Démasquer le Gain d'efficacité

La principale différence réside dans le nombre d'allocations de tas requises :

  • make_shared : 1 allocation
  • Direct shared_ptr : 2allocations

Cette allocation singulière en make_shared élimine le besoin d'un nouvel appel explicite, ce qui entraîne une efficacité accrue.

Considérations sur les exceptions

Pré-C 17 :
La gestion des exceptions pouvait auparavant faire des ravages, car le pointeur brut n'a peut-être pas été transmis en toute sécurité au constructeur shared_ptr.

C 17 et Plus tard :
Ce problème a été résolu grâce aux changements dans l'ordre d'évaluation des arguments de fonction. Aujourd'hui, les exceptions sont gérées avec élégance, garantissant l'intégrité de la mémoire.

Un inconvénient mineur de std::make_shared

Comme Casey l'a souligné, un inconvénient potentiel découle de l'allocation unique :

  • La mémoire contrôlée ne peut pas être libérée tant que le bloc de contrôle n'est plus utilisé, ce qui pourrait prolonger la rétention de mémoire en raison d'un pointeur faible. références.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal