Pourquoi le non-placement `new` et` delete` sont-ils intégrés au langage et pas seulement aux fonctions normales?

Pourquoi la new expression de non-placement et l’ expression de delete implémentées en tant que langage intégré au lieu de fonctions régulières?

Si nous avons…

  • une façon de demander / redonner de la mémoire à l’OS

  • un moyen d’invoquer explicitement un constructeur (placement new )

  • une manière d’appeler explicitement un destructeur ( ~T() )

… pourquoi le new emplacement et la delete ne seraient-ils que des fonctions régulières dans la bibliothèque standard? Exemple:

 template  T* library_new(Ts&&... xs) { auto* ptr = /* request enough memory for `T` from OS */; new (ptr) T(std::forward(xs)...); return ptr; } template  void library_delete(T* ptr) { ptr->~T(); /* reclaim memory for `T` from OS */ } 

    Si l’objective de l’utilisateur était de créer un object dans un emplacement de mémoire, le new semblait être une approche naturelle, car les renvois de références , les modèles variadiques et les nouveaux emplacements n’étaient plus chose à l’époque. Comme cela a été correctement souligné par les modèles @TC , ils ont été lancés en 1990 et leur mise en place en 1989. Les modèles Variadic, par contre, ne sont devenus partie intégrante que de C ++ 11.

    tl; dr Il n’y avait aucun moyen de transférer un tas d’arguments à un constructeur de type arbitraire (comme vous pouvez le faire avec les fonctions make ).

    Peut-être que ce n’est pas la meilleure référence, mais c’est ce que Wikipedia dit à propos du placement en C ++:

    Dans les versions antérieures de C ++, le placement n’était pas nouveau ; au lieu de cela, les développeurs ont utilisé une affectation explicite à this dans les constructeurs pour obtenir un effet similaire. Cette pratique a été déconseillée et supprimée plus tard, et la troisième édition du “Langage de programmation C ++” ne mentionne pas cette technique. Un soutien pour le placement de nouveaux opérateurs a été ajouté aux compilateurs vers 1995.

    Peut-être qu’en 2017, il est possible d’implémenter une new fonction de bibliothèque standard. Votre implémentation proposée utilise des fonctionnalités de langue ajoutées récemment (nombre d’entre elles après 2010).

    Le langage C ++, cependant, est beaucoup plus ancien (depuis 1983) et au début, il n’y avait pas de modèles variadiques, pas de typename , pas de new emplacements, pas de références de transfert.

    Au début, il n’y avait que le new standard et il devait s’agir d’une fonctionnalité de langue à ce moment-là, car il n’y avait aucun moyen de l’implémenter en tant que fonction de bibliothèque.

    S’ils étaient déjà fournis en tant que fonctions autonomes, il serait impossible de les remplacer par l’utilisateur.

    Par exemple, selon la norme actuelle, il est préférable d’écrire mon propre fichier new et de le delete qu’il soit utilisé dans le programme.

    18.6.2 Allocation et désallocation du stockage [new.delete]

    2 Remplaçable: le programme AC ++ peut définir des fonctions avec l’une ou l’autre de ces signatures de fonction et déplacer ainsi les versions par défaut définies par la bibliothèque standard C ++.

    Si ceux-ci étaient fournis exactement comme le rest des fonctions de la bibliothèque, alors chaque appel normal à new ou à delete entraînerait une erreur “plusieurs instances de correspondances de fonctions surchargées”.