24

複数の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ビットウィンドウでは機能しません。

より良いアプローチはありますか?コメントはありますか?

4

4 に答える 4

8

Q: 複数の dll に分割された C++ プログラムは、次のようにする必要があります。

A)mallocを置き換えますか?

B) 同じ dll モジュールで割り当てと割り当て解除が行われるようにしますか?

A: 正解は B です。複数の DLL を組み込んだ C++ アプリケーション設計では、1 つの DLL のヒープに割り当てられたものが同じ DLL モジュールによって解放されることを保証するメカニズムが存在することを確認する必要があります。


とにかく、なぜ C++ プログラムをいくつかの dll に分割するのでしょうか? C++プログラムとは、あなたが扱っているオブジェクトと型がc++テンプレート、STLオブジェクト、クラスなどであることを意味します.非常に慎重な設計と多くのコンパイラ固有の魔法がなければ、DLL境界を越えてc++オブジェクトを渡すことはできません.さまざまな dll でオブジェクト コードが大量に重複し、その結果、バージョンに非常に敏感なアプリケーションになります。クラス定義に小さな変更を加えると、すべての exe と dll が強制的に再構築され、アプリ開発に対する dll アプローチの主な利点の少なくとも 1 つが失われます。

アプリと dll の間のストレートな C インターフェイスに固執するか、地獄に苦しむか、単に C++ アプリ全体を 1 つの exe としてコンパイルするかのいずれかです。

于 2009-05-19T12:23:24.850 に答える
1

ネドマロック? また、smplayer は malloc をオーバーライドするために特別なパッチを使用していることにも注意してください。

于 2009-05-20T12:24:06.573 に答える
1

「複数の DLL と QT を使用する C++ プログラムには、malloc の代替を装備する必要がある」という前提はどこから来たのですか?

Windows では、すべての dll が共有 MSVCRT を使用する場合、malloc を置き換える必要はありません。デフォルトでは、Qt は共有 MSVCRT dll に対してビルドします。

次の場合に問題が発生します。

1) 静的リンクを使用する DLL と共有 VCRT を使用する DLL を混在させる

2)また、元の場所に割り当てられていないメモリを解放します (つまり、共有 VCRT によって割り当てられた静的にリンクされた dll 内のメモリを解放するか、またはその逆)

リソースに独自の ref カウント ラッパーを追加すると、特定の方法で割り当てを解除する必要があるリソースに関連する問題を軽減するのに役立つことに注意してください (つまり、元の dll へのコールバックを介して 1 つのタイプのリソースを破棄するラッパー、別のタイプのリソースを破棄するラッパー)。別の dll に由来するリソースのラッパーなど)。

于 2009-05-16T02:51:15.710 に答える