複数のDLLとQTを使用するC++プログラムには、Windowsのmallocが原因であることが確認できるパフォーマンスの問題のために、mallocの置換( tcmallocなど)を装備する必要があります。Linuxの場合は問題ありませんが、Windowsの場合はいくつかのアプローチがあり、どれも魅力的ではありません。
1.新しいmallocをlibに入れ、最初にリンクするようにします(その他のSO-質問)
これには欠点があります。たとえば、strdupは古いmallocを引き続き使用し、freeはプログラムをクラッシュさせる可能性があります。
2. lib.exe(Chrome)を使用して静的libcrtライブラリからmallocを削除します
これはクロム/クロムについてテスト/使用(?)されていますが、crtの静的リンクでのみ機能するという欠点があります。静的リンクには、1つのシステムライブラリがmsvcrtに対して動的にリンクされている場合に問題があり、ヒープの割り当て/割り当て解除に不一致がある可能性があります。私が正しく理解していれば、tcmallocは動的にリンクされ、すべての自己コンパイルされたdllに共通のヒープが存在する可能性があります(これは良いことです)。
3.パッチcrt-ソースコード(firefox)
Firefoxのjemallocは、明らかにWindows CRTソースコードにパッチを適用し、新しいcrtを構築します。これにも、上記の静的/動的リンクの問題があります。
これを使用して動的MSVCRTを生成することも考えられますが、ライセンスでは同じ名前のパッチが適用されたMSVCRTを提供することが禁止されているため、これは不可能だと思います。
4.実行時にロードされたCRTに動的にパッチを適用します
一部の商用メモリアロケータは、そのような魔法を実行できます。tcmallocでも可能ですが、これはかなり醜いようです。いくつかの問題がありましたが、修正されました。現在、tcmallocでは、64ビットウィンドウでは機能しません。
より良いアプローチはありますか?コメントはありますか?