Windows Malloc-Ersetzung (z. B. tcmalloc) und dynamische crt-Verknüpfung
Einem C++ - Programm, das verwendet mehrere DLLs und QT sollten ausgestattet sein mit einem malloc-Ersatz (wie tcmalloc) für performance-Probleme, die überprüft werden können verursacht werden durch Windows malloc. Mit linux ist es kein problem, aber mit windows, gibt es mehrere Ansätze, und ich finde keiner von Ihnen appellieren:
1. Setzen Sie neue malloc in lib und stellen Sie sicher, dass link es erste (SO die Frage)
Dies hat den Nachteil, dass zum Beispiel strdup wird noch die alte malloc und free können das Programm zum Absturz bringen.
2. Entfernen malloc aus der statischen Bibliothek mit libcrt lib.exe (Chrom)
Dies ist getestet/verwendet(?) für chrome/chromium, hat aber den Nachteil, dass es nur funktioniert mit einer statischen Verknüpfung der crt. Die statische Verbindung hat das problem, wenn ein system die Bibliothek dynamisch gelinkt gegen msvcrt kann es Unterschiede in der heap-allocation/deallocation. Wenn ich es richtig verstehe, tcmalloc könnte, werden dynamisch eingebunden, so dass es einen gemeinsamen Haufen, für alle selbst kompilierten dlls (das ist gut).
3. Patch crt-Quellcode (firefox)
Firefox ist jemalloc anscheinend patches die windows-CRT-Quellcode und erstellt eine neue crt. Das hat wiederum die statische/dynamische Verknüpfung von problem vor.
Könnte man denken, mit dieser zu generieren, eine dynamische MSVCRT, aber ich denke, das ist nicht möglich, da die Lizenz verbietet die Bereitstellung von Patches MSVCRT mit dem gleichen Namen.
4. Dynamisch patchen geladen CRT zur Laufzeit
Einige kommerzielle memory allocators tun können, so magic. tcmalloc tun kann, auch, aber das scheint eher hässlich. Es hatte einige Probleme, aber Sie wurden behoben. Derzeit, mit tcmalloc es funktioniert nicht unter 64-bit windows.
Gibt es bessere Ansätze? Irgendwelche Kommentare?
InformationsquelleAutor der Frage Weidenrinde | 2009-05-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
Q: Eine C++ - Programm, aufgeteilt auf mehrere dlls sollten:
A) ersetzen malloc?
B) sicherzustellen, dass die Zuteilung und de-Zuweisung geschieht in der gleichen dll-Modul?
A: Die korrekte Antwort ist B. Eine c++ - Anwendung-design, die enthält mehrere DLLs SOLLTEN sicherstellen, dass ein Mechanismus vorhanden ist, um sicherzustellen, dass die Dinge, die sind reserviert auf dem heap in einer dll, die frei sind, würden durch die gleiche dll-Modul.
Warum würden Sie split ein c++ - Programm in mehrere dlls überhaupt? Durch das c++ - Programm, das ich meine, ist, dass die Objekte und Typen, die Sie beschäftigen, sind c++, templates, STL-Objekte, Klassen usw.. Sie KÖNNEN sich NICHT über c++ - Objekte in der dll boundries ohne sehr sorgfältige Planung und viel compiler-spezifischen Magie, oder leiden unter massiven Vervielfältigung der Objekt-code in den verschiedenen dlls, und als Ergebnis eine Anwendung, die extrem auf die version geachtet. Jede kleine änderung an einer Klasse definition dazu zwingen wird, ein Umbau, der alle exe-und dll-Dateien, entfernen von mindestens einer der großen Vorteile der dll-Ansatz für die app-Entwicklung.
Entweder zu halten, um eine gerade C-Schnittstelle zwischen app und dll ' s, leiden, Hölle, oder einfach kompilieren die gesamte c++ - app als eine exe-Datei.
InformationsquelleAutor der Antwort Chris Becke
Es ist eine kühne Behauptung, daß ein C++ - Programm "sollte ausgestattet sein mit einem malloc-Ersatz (wie tcmalloc) für performance-Probleme...."
Meisten system-allocators ist ungefähr so gut wie ein Allgemeinen Zweck Zuweisung werden kann. Sie können es besser nur, wenn Sie eine sehr spezifische Zuordnung von Muster.
In der Regel werden solche spezielle Muster gelten nur für einen Teil des Programms, in dem Fall ist es besser, wenden Sie den benutzerdefinierten Zuweisung zu den spezifischen Teil, profitieren können, als es ist, Global ersetzen Sie die Zuweisung.
C++ bietet ein paar Möglichkeiten, selektiv zu ersetzen, die Zuweisung. Zum Beispiel, können Sie eine Zuweisung zu einer STL-container, oder Sie können Sie überschreiben und löschen auf eine Klasse von der Klasse basis. Beide geben Ihnen viel bessere Kontrolle als jeder hack die weltweit ersetzt die Zuweisung.
Beachten Sie auch, dass das ersetzen von malloc und free, nicht notwendigerweise ändern Sie die Zuweisung verwendet, die durch die Operatoren new und delete. Während der Globale operator new wird in der Regel umgesetzt mit malloc, es ist nicht erforderlich, es so zu tun. So ersetzt malloc kann auch nicht beeinflussen, die meisten Zuweisungen.
Wenn Sie C, die Chancen sind Sie wickeln kann oder Schlüssel ersetzen malloc und free-Aufrufe mit Ihren benutzerdefinierten Zuweisung nur dort, wo es darauf ankommt, und überlassen Sie den rest des Programms zu verwenden, die Standard-Zuweisung. (Wenn das nicht der Fall ist, möchten Sie vielleicht zu prüfen, einige refactoring.)
System allocators haben jahrzehntelange Entwicklung hinter sich. Sie sind stabil und gut getestet. Sie führen sehr gut für Allgemeine Fälle (in Bezug auf raw speed, thread Konflikte und Fragmentierung). Sie haben debugging-Versionen für die Leck-Erkennung und-Unterstützung für tracking-tools. Einige sogar verbessern Sie die Sicherheit Ihrer Anwendung durch die Bereitstellung von Schutzmaßnahmen gegen heap-Pufferüberlauf-Schwachstellen. Sind die Chancen, die Bibliotheken, die Sie verwenden möchten haben, getestet wurde nur mit dem system-Zuweisung.
Meisten der Techniken, das system zu ersetzen Zuweisung verlieren diese Vorteile. In einigen Fällen, Sie können sogar Erhöhung Speicher Bedarf (da Sie nicht freigegeben werden können, die mit der DLL Laufzeit möglicherweise von anderen Prozessen verwendet wird). Sie neigen auch dazu, sehr empfindlich gegenüber Veränderungen in der compiler-version runtime-version, und sogar OS-version. Mit einem gezwickt version der Laufzeitumgebung verhindert, dass die Benutzer immer Vorteile von runtime-updates vom Hersteller des Betriebssystems. Warum geben alle, die, wenn Sie beibehalten können diese Vorteile durch die Anwendung einer benutzerdefinierten Zuweisung nur zu den außergewöhnlichen Teil von dem Programm profitieren können?
InformationsquelleAutor der Antwort Adrian McCarthy
Wo kommt deine Prämisse "Ein C++ - Programm, das verwendet mehrere DLLs und QT sollten ausgestattet sein mit einem malloc-Ersatz" her?
Wenn unter Windows der alle dlls die gemeinsame Nutzung der "MSVCRT", dann gibt es keine Notwendigkeit, Sie zu ersetzen malloc. Standardmäßig Qt baut gegen den gemeinsamen MSVCRT dll.
Wird man auf Probleme stoßen, wenn Sie:
1) mix-dlls mit statischen Verknüpfung von vs mit der gemeinsamen VCRT
2) UND auch der freie Speicher, der nicht reserviert wurde, wo es herkam (also der freie Speicher auf eine statisch gelinkte dll reserviert wurde durch die gemeinsame VCRT oder Umgekehrt).
Beachten Sie, dass das hinzufügen Ihrer eigenen ref gezählt wrapper für eine Ressource können dazu beitragen, dass Probleme im Zusammenhang mit Ressourcen müssen freigegeben ist, in eine bestimmte Art und Weise (dh, einen wrapper, verfügt über eine Art von Ressource, die über einen Aufruf zurück an die Ursprungs-dll, einem anderen wrapper für eine Ressource, die stammt aus einer anderen dll, etc).
InformationsquelleAutor der Antwort sean e
nedmalloc? auch beachten Sie, dass die smplayer verwendet einen speziellen patch zu überschreiben, malloc, die vielleicht in die Richtung, die Sie unterwegs sind.
InformationsquelleAutor der Antwort rogerdpack