malloc()
現在、Windows での実装を検討しています。しかし、私の研究では、私を困惑させるものに出くわしました。
まず、API レベルでは、Windows は主にHeapAlloc()
とのVirtualAlloc()
呼び出しを使用してメモリを割り当てることを知っています。ここから、Microsoft の実装malloc()
(CRT に含まれているもの - C ランタイム) は、基本的にHeapAlloc()
480 バイトを超えるブロックを呼び出しVirtualAlloc()
、断片化を防ぐために、小さな割り当て用に割り当てられた特別な領域を管理することを収集します。
まあ、それはすべて良いことです。しかし、Microsoft の .NET よりも最大 125% 高速であると主張するmalloc()
nedmallocなどmalloc
、 .
これはすべて、いくつかのことを疑問に思います。
HeapAlloc()
小さなブロックだけを呼び出すことができないのはなぜですか? フラグメンテーションに関してパフォーマンスが低下していますか (たとえば、「ベスト フィット」ではなく「ファースト フィット」を実行するなど)?- 実際、さまざまな API 割り当て呼び出しの内部で何が起こっているかを知る方法はありますか? それはかなり役に立ちます。
nedmalloc
Microsoft よりもはるかに高速な理由は何malloc
ですか?HeapAlloc()
上記のことから、 /は非常に遅いので、たまに呼び出して、割り当てられたメモリ自体を管理するVirtualAlloc()
方がはるかに高速であるという印象を受けました。malloc()
その仮定は本当ですか?それともmalloc()
、断片化のために「ラッパー」が必要なだけですか? このようなシステム コールは高速であると考える人もいるでしょう。少なくとも、システム コールを効率的にするために何らかの工夫が必要であると考える人もいるでしょう。- 本当なら、なぜそうなのですか?
malloc
平均して、典型的な呼び出し (おそらく、すでに割り当てられているセグメントの数の関数)によって実行されるメモリの読み取り/書き込みの数 (桁違い) は? 私は直観的に、平均的なプログラムでは数十だと思いますが、そうですか?