Maison  >  Article  >  développement back-end  >  Pourquoi `std::list::sort()` est-il passé à un tri par fusion descendant dans Visual Studio 2015 ?

Pourquoi `std::list::sort()` est-il passé à un tri par fusion descendant dans Visual Studio 2015 ?

Linda Hamilton
Linda Hamiltonoriginal
2024-11-01 17:47:02736parcourir

 Why Did `std::list::sort()` Switch to a Top-Down Merge Sort in Visual Studio 2015?

Pourquoi le passage soudain à une stratégie descendante dans std::list<>::sort() ?

Dans Visual Studio 2015 (VS2015), Microsoft a modifié la stratégie de tri de std::list<>::sort() du tri par fusion ascendant traditionnel à une approche descendante. Ce changement a éliminé l'utilisation d'un tableau interne de listes et a adopté des itérateurs pour suivre les limites d'exécution triées dans la liste d'origine.

Raisons du changement

Stephan T. Lavavej , le développeur de l'approche descendante, a cité la nécessité d'éviter l'allocation de mémoire et la construction d'allocateurs autres que ceux par défaut. VS2015 a introduit des allocateurs qui n'étaient plus constructibles et avec état par défaut, ce qui posait des problèmes lors de l'utilisation de l'approche ascendante précédente.

Mise en œuvre de l'approche descendante

Le haut -down utilise un algorithme récursif qui divise récursivement la liste en moitiés jusqu'à ce qu'elle atteigne des cas de base où les listes sont vides ou contiennent un seul élément. La fonction _Sort partitionne la liste en trois segments : l'exécution gauche, l'exécution droite et l'itérateur de fin. La logique de fusion est effectuée à l'aide de std::list::splice pour déplacer les nœuds dans la liste d'origine, en maintenant la sécurité des exceptions.

Considérations sur les performances

Alors que la logique descendante Cette approche répond aux problèmes d'allocation de mémoire, mais elle s'accompagne d'une pénalité de performances par rapport au tri par fusion ascendant d'origine. Pour les grandes listes avec des nœuds dispersés, l’approche descendante souffre d’une augmentation des échecs de cache, ce qui entraîne des temps d’exécution plus lents. Dans de tels cas, il peut être plus rapide de déplacer la liste vers un tableau ou un vecteur, de la trier et de créer une nouvelle liste à partir du tableau ou du vecteur trié.

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!

Déclaration:
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