C ++: Löschen vs. Frei und Leistung
- Betrachten:
char *p=NULL; free(p) //or delete p;
Was passiert, wenn ich
free
unddelete
aufp
? - Wenn ein Programm dauert eine lange Zeit zum ausführen, sagen wir 10 Minuten, gibt es eine Möglichkeit, zu reduzieren seine Laufzeit auf 5 Minuten?
Kommentar zu dem Problem
Dies sollte aufgeteilt werden in zwei Fragen, IMO.
Wenn Sie die Wahl haben zwischen "delete p;" und "free(p);" nur sicherstellen, dass Sie kohärent-löschen, was Sie neu und kostenlos was Sie malloc.
InformationsquelleAutor der Frage user41522 | 2008-11-30
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einige Hinweise zur Leistung über new/delete und malloc/free:
malloc und free nicht den Konstruktor aufrufen und deconstructor, beziehungsweise. Dies bedeutet, dass Ihre Klassen nicht bekommen zuerst entsprechend formatiert oder deinitialized automatisch, das könnte schlecht sein (z.B. uninitalized Zeiger)! Das spielt keine Rolle für POD-Datentypen wie char und double, obwohl, da Sie nicht wirklich ein Tor.
new und delete tun den Konstruktor aufrufen und deconstructor. Dies bedeutet, dass Ihre Instanzen der Klasse werden zuerst entsprechend formatiert und deinitialized automatisch. Aber normalerweise gibt es einen performance-hit (im Vergleich zu plain-Zuweisung), aber das ist für die besser.
Schlage ich vor, konsequent mit new/malloc Verbrauch, es sei denn, du hast einen Grund (z.B. realloc). Auf diese Weise, Sie haben weniger Abhängigkeiten, wodurch Ihre code-Größe und die Ladezeit (nur durch eine smidgin, obwohl). Auch, Sie werden nicht mess up von frei ' Ing etwas zugewiesen, mit neuen, oder löschen etwas zugewiesen mit malloc. (Dies wird wahrscheinlich Ursache ein Absturz!)
InformationsquelleAutor der Antwort strager
Antwort 1: Beide
free(p)
unddelete p
arbeiten sehr gut mit einem NULL-Zeiger.Antwort 2: nicht zu beantworten, ohne zu sehen, die langsamen Teile des Codes. Sie sollten Profil den code! Wenn Sie mit Linux schlage ich vor, mit Callgrind (Teil Valgrind), um herauszufinden, welche Teile der Ausführung am längsten dauert.
InformationsquelleAutor der Antwort activout.se
Frage eins: nichts wird passieren.
Aus dem aktuellen Entwurf der ISO/IEC 14882 (oder: C++):
So, von ISO/IEC 9899:1999 (oder: C):
Aus der C++ - standard wieder, für Informationen über
delete
dieser Zeit:Siehe auch:
new
/delete
undmalloc
/free
?free()
- d-Speicher in c?
InformationsquelleAutor der Antwort cic
Nichts passieren wird, wenn Sie rufen Sie kostenlos mit einem NULL-parameter aus, oder löschen Sie mit einem NULL-Operanden. Beide sind so definiert, dass NULL-Werte akzeptieren und führen keine Aktion aus.
Gibt es eine Reihe von Dingen, die Sie ändern können, in C++ - code, die Sie beeinflussen können, wie schnell es läuft. Oft nützlich, die meisten (in ungefährer Reihenfolge) sind:
Gesagt haben, dass, divideandconquer ist absolut richtig - Sie können nicht effektiv die Geschwindigkeit Ihres Programms, es sei denn, Sie wissen, was es verbringt seine Zeit damit. Manchmal kann dies erraten, wenn man weiß, wie der code funktioniert, andere Male, ist es sehr verwunderlich. So ist es am besten zu Profilieren. Auch wenn Sie nicht Profil den code, um zu sehen, wo genau die Zeit, wenn Sie Messen, welche Auswirkungen Ihre änderungen haben oft können Sie es herausfinden, irgendwann.
InformationsquelleAutor der Antwort Steve Jessop
Antwort zu Frage 2:
Die vorherigen Antworten sind ausgezeichnet. Aber ich wollte nur hinzufügen, etwas über die vor-Optimierung. Angenommen, ein Programm mittlerer Komplexität, die 90/10-Regel gilt in der Regel, d.h. 90% der Ausführungszeit verbracht wird in 10% des Codes. "Optimierte" code ist oft schwieriger zu Lesen und zu pflegen. Also, immer die Probleme lösen, die erste, dann sehen Sie, wo die Engpässe sind (profiling ist ein gutes Werkzeug).
InformationsquelleAutor der Antwort E Dominique
Als andere haben darauf hingewiesen, löschen (oder freigeben) ein NULL-Zeiger wird nicht alles tun. Allerdings, wenn Sie hatte zugewiesenen Speicher dann, ob man mit free() oder delete, hängt von der Methode, die Sie verwendet, um zuzuteilen. Zum Beispiel, wenn Sie verwendet hatten, malloc() Speicher zuzuweisen, dann sollten Sie free() und wenn Sie verwendet hatte, neue zu reservieren, dann sollten Sie löschen. Achten Sie jedoch darauf, nicht zu mischen die Speicherzuordnungen. Verwenden Sie eine einzige Weg, um allocate und deallocate.
Für die zweite Frage, wird es sehr schwierig, zu verallgemeinern, ohne dass der eigentliche code. Es sollte darauf geachtet werden auf einer Fall-zu-Fall-basis.
InformationsquelleAutor der Antwort Naveen
Guten Antworten alle.
Auf dem performance-Problem, diese bietet eine Methode, die die meisten können sich nicht vorstellen, wird funktionieren, aber ein paar wissen es funktioniert, überraschend gut.
Die 90/10-Regel wahr ist. Meiner Erfahrung nach, gibt es meist mehrere Krisenherde, und Sie sind in der Regel in mid-levels der call-stack. Sie sind oft verursacht durch die Verwendung über-Allgemeine Daten-Strukturen, aber man sollte nie etwas zu beheben, es sei denn, Sie haben bewiesen, dass es tatsächlich ein problem. Performance-Probleme sind unglaublich unberechenbar.
Befestigung jeder einzelnen performance-problem kann es nicht geben Sie die Beschleunigung, die Sie brauchen, aber jeden, den Sie fix macht die restlichen nehmen einen größeren Prozentsatz der verbleibenden Zeit, so dass Sie leichter zu finden. Die Beschleunigungen verbinden, die in einem zusammengesetzten Mode, so können Sie überrascht sein auf das Endergebnis.
Wenn du nicht mehr finden, erhebliche Probleme, die Sie lösen können, das Sie getan haben, ungefähr so gut wie Sie können. Manchmal, an diesem Punkt, ein redesign (wie die Verwendung von code-Generierung) können Sie eine weitere Runde von Beschleunigungen.
InformationsquelleAutor der Antwort Mike Dunlavey