43 votes

Pourquoi sont std::allocator #39;s construire et détruire les fonctions dépréciées en c '+17?

Le c++17 spécification dénonçait l' construct et destroy des membres de l' std::allocator objet. Le groupe de travail a fourni une justification pour dépréciation d'autres fonctions membre ici, sous la rubrique "Railler les redondant membres de std::allocator".

Cependant, ils ne mentionnent pas spécifiquement pourquoi ces deux membres sont obsolètes, ou ce que la recommandation est pour le remplacement de cette fonctionnalité. Je suis en supposant que l'implication est d'utiliser std::allocator_traits::construct à la place.

Je suis un peu confus quant à savoir si la mise en œuvre de construct peut encore être nécessaire, dans certains cas, parce que ce commentaire sur std::allocator_traits::construct

Parce que cette fonction fournit le système automatique de tomber en arrière, pour le placement de nouvelles, la fonction de membre de construire() est une option de l'Allocateur exigence depuis C++11.

Pour personnalisé allocateurs (par exemple pour la page aligné mémoire à l'aide de memalign), va retomber placement new toujours de produire le comportement correct?

22voto

T.C. Points 22510

L' allocateur exigences de la table dit qu' construct(c, args), le cas échéant, doivent "construire un objet de type C à c".

Il ne dit absolument rien sur 1) quels sont les arguments à passer à Cs'constructeur ou 2) comment ces arguments doivent être transmis. C'est l'allocateur de choix, et, en fait, deux allocateurs dans la norme ne plaisante pas avec les arguments avant de les transmettre Cs'constructeur: std::scoped_allocator_adaptor et std::pmr::polymorphic_allocator. Lors de la construction d'un std::pair, en particulier, les arguments qu'ils passent pairs'constructeur peut même ne pas ressembler à ceux qu'ils ont reçus.

Il n'y a pas d'exigence de perfection de l'avant, que ce soit; C++03-style construct(T*, const T&) est conforme si inefficace.

std::allocators' construct et destroy sont déconseillées, car elles sont inutiles: pas de bon de C++11 et, plus tard, le code devrait jamais les appeler directement, et ils n'apportent rien de plus par défaut.


La manipulation de la mémoire de l'alignement devrait être la tâche de l' allocate, pas construct.

10voto

NathanOliver Points 10062

Les fonctions ont été supprimés avec les autres à partir de l'étude D0174R0 Autodérision Vestige de Pièces de Bibliothèque en C++17. Si l'on regarde la section pertinente, nous avons

De nombreux membres de std::allocator de manière redondante double comportement qui est par ailleurs produite par std::allocator_traits<allocator<T>>, et pourrait être retirés afin de simplifier cette classe. De plus, addressof gratuitement en fonction remplace std::allocator<T>::address ce qui implique un allocateur de l'objet du bon type. Enfin, le type de référence alias étaient initialement prévue comme prévu des moyens pour l'extension à d'autres allocateurs, mais s'est avéré ne pas servir à des fins utiles lorsque nous avons précisé les exigences de l'allocateur (17.6.3.5 [allocateur.exigences]).

Tout en nous ne peut pas supprimer ces membres sans casser la compatibilité ascendante avec le code qui sert explicitement de cette allocateur type, nous ne devrions pas le recommander leur utilisation continue. Si un type veut soutenir générique allocateurs, il doit accéder à l'allocateur de fonctionnalités par le biais d'allocator_traits plutôt que d'accéder directement à l'allocateur de membres - sinon il ne sera pas en charge correctement les allocateurs qui s'appuient sur les traits de synthétiser les comportements par défaut. De même, si un utilisateur n'a pas l'intention de soutenir le générique allocateurs, il est beaucoup plus simple d'invoquer directement nouveau, supprimer, et d'assumer les autres propriétés de std::allocator comme pointeur-types directement.

C'est moi qui souligne

Ainsi, le rationnel, c'est que nous n'avez pas besoin de dupliquer le code dans l'allocateur puisque nous avons l'allocateur de traits. Si l'on regarde std::allocator_traits nous allons voir qu'il n'ont

allocate
deallocate
construct
destroy
max_size

les fonctions statiques afin que nous puissions les utiliser à la place de ceux de l'allocateur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X