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?

Kommentar zu dem Problem
Welche Methode hast du benutzt? Das Tat Sie verwenden, um zu überprüfen, die Behauptung, dass die Alternative Zuweisung besser funktioniert als die mit der CRT-malloc? Welche version der CRT hast du und ist es besser/schlechter/das gleiche wie neuere Versionen? Kommentarautor: Adrian McCarthy
Warum nicht versuchen, ersetzen Sie die Globale C++ - neu? Wäre das nicht funktioniert (und passend zu den shared libs + app Haupt-Binär + ms crt als shared lib setup)? Kommentarautor: mlvljr

InformationsquelleAutor der Frage Weidenrinde | 2009-05-13

Schreibe einen Kommentar