問題タブ [nedmalloc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
435 参照

c - nedmalloc:mem> = fmはどこから来たのですか?

nedmallocをアプリケーションに実装しているときに、nedmallocがメモリのブロックを解放することを拒否し、割り当てられなかったと主張する状況に頻繁に遭遇します。

v1.06beta1_svn1151バージョンを使用しています。

デバッグ中に、失敗している特定の条件が表示されるようになりましたが、他のすべて(マジックナンバーを含む)は成功しています。条件は次のとおりです。

Win32では、これは次と同等のようです。

これは次と同じようです:

私の場合、私は本当にmem<fmを見ます。私が今理解していないのは、この状態がどこから来ているのかということです。コード内のどこにもfm<=mを保証するものは見つかりません。それでも、「selectは壊れていません」:それが本当にnedmallocのバグであるとは思えません。おそらくどこかで何か間違ったことをしているのでしょうが、それを見つけることができません。nedmallocのデバッグ機能をオンにすると、問題は解決します。

ここの誰かがnedmallocの内部動作を理解している場合、なぜfm <= memが保証されているのか説明していただけますか?

0 投票する
4 に答える
1973 参照

c++ - Boost::Mutex & Malloc

C++ でより高速なメモリ アロケータを使用しようとしています。ライセンス/コストの関係で Hoard を使用できません。シングルスレッド設定で NEDMalloc を使用していて、優れたパフォーマンスが得られましたが、別のものに切り替える必要があるかどうか疑問に思っています-私が理解しているように、NEDMalloc は C ベースの malloc() & free() C++ ベースの new & delete 演算子 (私が頻繁に使用する) ではありません。

問題は、スレッドセーフにする必要があるため、(過剰なコピーを防ぐために) 参照カウントされるオブジェクトを malloc しようとしていますが、このオブジェクトにはミューテックス ポインターも含まれています。そうすれば、最後のコピーを削除しようとしている場合は、まずポインターをロックしてからオブジェクトを解放し、最後にミューテックスをロック解除して解放する必要があります。

ただし、malloc を使用して boost::mutex を作成することは不可能に見えます。コンストラクターを直接呼び出すことは禁止されているため、プライベート オブジェクトを初期化できないからです。

そのため、この奇妙な状況が残っています。 new を使用してロックを割り当て、 nedmalloc を使用して他のすべてを割り当てています。しかし、大量のメモリを割り当てると、割り当てエラーが発生します (nedmalloc の代わりに malloc に切り替えると消えます ~ しかし、パフォーマンスはひどいです)。私の推測では、これはメモリ内の断片化と、nedmalloc と new がナイスを並べて配置できないことが原因であると考えられます。

より良い解決策が必要です。何を提案しますか?

0 投票する
2 に答える
3807 参照

windows - Windows のメモリ割り当てに関する質問

malloc()現在、Windows での実装を検討しています。しかし、私の研究では、私を困惑させるものに出くわしました。

まず、API レベルでは、Windows は主にHeapAlloc()とのVirtualAlloc()呼び出しを使用してメモリを割り当てることを知っています。ここから、Microsoft の実装malloc()(CRT に含まれているもの - C ランタイム) は、基本的にHeapAlloc()480 バイトを超えるブロックを呼び出しVirtualAlloc()、断片化を防ぐために、小さな割り当て用に割り当てられた特別な領域を管理することを収集します。

まあ、それはすべて良いことです。しかし、Microsoft の .NET よりも最大 125% 高速であると主張するmalloc()nedmallocなどmalloc、 .

これはすべて、いくつかのことを疑問に思います。

  1. HeapAlloc()小さなブロックだけを呼び出すことができないのはなぜですか? フラグメンテーションに関してパフォーマンスが低下していますか (たとえば、「ベスト フィット」ではなく「ファースト フィット」を実行するなど)?

    • 実際、さまざまな API 割り当て呼び出しの内部で何が起こっているかを知る方法はありますか? それはかなり役に立ちます。
  2. nedmallocMicrosoft よりもはるかに高速な理由は何mallocですか?

  3. HeapAlloc()上記のことから、 /は非常に遅いので、たまに呼び出して、割り当てられたメモリ自体を管理するVirtualAlloc()方がはるかに高速であるという印象を受けました。malloc()その仮定は本当ですか?それともmalloc()、断片化のために「ラッパー」が必要なだけですか? このようなシステム コールは高速であると考える人もいるでしょう。少なくとも、システム コールを効率的にするために何らかの工夫が必要であると考える人もいるでしょう。

    • 本当なら、なぜそうなのですか?
  4. malloc平均して、典型的な呼び出し (おそらく、すでに割り当てられているセグメントの数の関数)によって実行されるメモリの読み取り/書き込みの数 (桁違い) は? 私は直観的に、平均的なプログラムでは数十だと思いますが、そうですか?

0 投票する
1 に答える
85 参照

c - メモリ リークに nedflush を使用する際の Pb

nedmalloc のデバッグ機能を使用して、コード内の潜在的なメモリ リークを見つけようとしています。そこで、フラグENABLE_LOGGINGとをアクティブにしNEDMALLOC_TESTLOGENTRYます。

私のプログラムでは、システム メモリ プールのみを使用します。プログラムの最後で、neddestroysyspoolすべてのメモリ イベントをフラッシュするために関数を呼び出します。

まず、スタック トレース機能を有効にすることができません。この深さを変更すると、数回の割り当て後にプログラムがクラッシュします。VS2010 でコンパイルするには、自分自身を;DeinitSymの呼び出しで定義する必要がありました。CloseHandle私は正しくやっているといいのですが、うまくいきません。だから私はそれを使用しません。

したがって、ファイル nedmalloc.csv を解析するだけです。アドレスのおかげでソートし、割り当てられたサイズを合計し、解放されたサイズをアドレスから減算します。理由は不明ですが、いくつかの大きなチャンク (サイズ > 400kb) では、割り当て時に指定されたサイズは正しいのですが、解放時に指定されたサイズは異なり、割り当てられたサイズを超えています。たとえば、840352 バイトのブロックを割り当てましたが、解放すると記録されたサイズは 851932 バイトでした。正常ですか?

この問題に対する答えやヒントはありますか?