38 votes

Pourquoi les fonctions de non-placement `new` et `delete` sont-elles intégrées au langage et non pas des fonctions ordinaires ?

Pourquoi les non-placement new expression et le delete expression implémentées en tant que fonctions intégrées au langage au lieu de fonctions ordinaires ?

Si nous avons...

  • un moyen de demander/recevoir de la mémoire au système d'exploitation.

  • une façon d'invoquer explicitement un constructeur (placement new )

  • un moyen d'invoquer explicitement un destructeur ( ~T() )

...pourquoi le non-placement ne pourrait-il pas new et delete simplement des fonctions ordinaires de la bibliothèque standard ? Exemple :

template <typename T, typename... Ts>
T* library_new(Ts&&... xs)
{
    auto* ptr = /* request enough memory for `T` from OS */;
    new (ptr) T(std::forward<Ts>(xs)...);
    return ptr;
}

template <typename T>
void library_delete(T* ptr)
{
    ptr->~T();
    /* reclaim memory for `T` from OS */
}

26voto

Curious Points 2258

Si l'objectif de l'utilisateur était de créer un objet dans un emplacement mémoire, alors new semblait être une approche naturelle puisque renvoi des références , modèles variadiques et nouveau placement n'existaient pas à l'époque. Comme l'a correctement souligné @T.C. Les modèles sont sortis en 1990 et ont été placés neufs en 1989. Les modèles variadiques, quant à eux, n'ont fait partie du C++ qu'en C++11.

tl;dr Il n'y avait aucun moyen de transmettre un ensemble d'arguments à un constructeur d'un type arbitraire (comme on peut le faire aujourd'hui avec le logiciel make fonctions).

14voto

axiac Points 13906

Ce n'est peut-être pas la meilleure référence, mais voici ce que dit Wikipédia à ce sujet placement new en C++ :

Dans les versions antérieures de C++, la fonction nouveau placement 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épréciée et supprimée par la suite, et la troisième édition de The "Le langage de programmation C++" ne mentionne pas cette technique. Le soutien de nouveau placement a été ajouté aux compilateurs depuis 1995.

Peut-être qu'en 2017, il sera possible de mettre en œuvre new comme une fonction de la bibliothèque standard. L'implémentation que vous proposez utilise des fonctionnalités du langage qui ont été ajoutées récemment (beaucoup 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 placement new pas d'envoi de références.

Au début, il n'y avait que l'ordinaire new et il fallait que ce soit une fonctionnalité du langage à l'époque, car il n'y avait aucun moyen de l'implémenter en tant que fonction de bibliothèque.

4voto

VTT Points 27056

Si elles étaient déjà fournies en tant que fonctions autonomes, il serait impossible de les remplacer par des fonctions définies par l'utilisateur.

par exemple, actuellement, selon la norme, il est légal d'écrire mon propre globl new et delete ils seront utilisés tout au long du programme.

18.6.2 Allocation et désallocation de mémoire [nouveau.supprimé]

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

Si elles étaient fournies comme le reste des fonctions de la bibliothèque, chaque appel normal à new ou delete entraînerait l'erreur "plus d'une instance de la fonction surchargée correspond aux arguments".

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