Pourquoi sont-new()/delete() plus lent que malloc()/free()?
Pourquoi new()/delete() est plus lent que malloc()/free()?
EDIT:
Merci pour les réponses jusqu'à présent. Veuillez remarquer spécifications de la norme C++ mise en œuvre de la nouvelle() et delete() si vous en avez merci!
- Parce que la comparaison n'a aucun sens. Comparer
malloc
avec::operator new
etfree
avec::operator delete
pour obtenir une équivalence.
Vous devez vous connecter pour publier un commentaire.
Regarder ce morceau de code C:
La
new
opérateur en C++ est essentiellement ce que le ci-dessus morceau de code ne. C'est pourquoi il est plus lent quemalloc()
.De même avec
delete
. Il fait l'équivalent de ceci:Si les constructeurs et les destructeurs sont vides (comme pour built-ins),
new
etdelete
ne devrait pas être plus lent quemalloc()
etfree()
sont. (Si ils sont, c'est souvent dû au fait que le commun des implémentations appelmalloc()
/free()
sous le capot, de sorte qu'ils sont un wrapper autour d'eux. Habillage de coûts. Il se peut également que le code qui a besoin de savoir qu'aucun des constructeurs/destructeurs sont appelés. Que serait le coût, aussi.)Modifier pour répondre À votre question supplémentaire:
new
etdelete
ne sont pas des fonctions, elles sont des opérateurs. Ce:new data()
est appelé un nouvelle expression. Il fait deux choses. D'abord il appelle laoperator new
, puis on initialise l'objet, généralement en invoquant le constructeur approprié. (Je dis "normalement" car built-ins n'ont pas de constructeurs. Mais une nouvelle expression impliquant un haut-fonctionne de la même façon, tout de même.)Vous pouvez manipuler ces deux phases. Vous pouvez créer votre propre constructeurs de manipuler l'initialisation de votre types et vous pouvez surcharge
operator new
(même avec plusieurs surcharges de différents arguments supplémentaires et aussi spécifiquement pour chaque classe, si vous voulez) dans le but de manipuler l'allocation d'espace de stockage. Si vous n'avez pas à appliquer votre propreoperator new
, la version de la bibliothèque standard est utilisé. Une commune de mise en œuvre de la présente appelsmalloc()
.De même, si vous écrivez
delete pd
, appelé supprimer l'expression, deux choses se produisent: selonpd
, l'objet est de-initialisé, généralement en appelant son destructeur, puis la mémoire est libérée en appelant un desoperator delete
.Encore une fois, vous pouvez manipuler à la fois de la phase, en écrivant votre propre destructeur, et en écrivant votre propre version de
operator delete
. (La version deoperator delete
qui vient avec votre bibliothèque standard est souvent mis en place pour appelerfree()
.)new et delete sont à traiter avec la construction/destruction d'une partie de leur travail est effectivement l'appel de malloc() et free() - malloc() et free() sont crus allocation/libération de mémoire.
new
etdelete
sont en train de faire le même travail quemalloc
etfree
plus ils appellent les constructeurs/destructeurs. Je ne voudrais pas qu'il y ait beaucoup de différence, si, sauf vraiment lent constructeurs/destructeurs.Si vous les utilisez pour allouer de la "plaine des données anciennes", telles que le constructeur/destructeur sont triviaux, ils sont peu susceptibles de différer de manière significative de la vitesse de
malloc
/free
. Il est possible (probable?) que vous avez fait une erreur quelque part dans vos mesures, qui introduit un biais dans les résultats. Vraiment tout ce qu'ils font à côté de l'appel àmalloc
/free
est d'exécuter du type constructeur/destructeur (plusieurs fois pour les tableaux).new int
de avecnew int()
? Cela ne faire une différence, puisque ce dernier garantit laint
être initialisé à zéro, tandis que l'ancienne ne fait pas d'initialisation à tous.Lorsque le
new
opérateur est appelé, deux choses se produisent:Donc, en raison de la surcharge de la construction d'objets,
new
est plus lent quemalloc
.De même,
delete
fait suite à deux choses:En bref,
malloc
alloue seulement de la mémoire brute, alors quenew
non seulement alloue de la mémoire brute, mais transforme la mémoire brute dans les objets.Ils ne devraient pas être, et ils ne sont pas dans la base de code, je suis en train de travailler.
Où je travaille, malloc/free est plus lente et inefficace et que new/delete pour deux raisons: