異なった環境でちゃんと動くかどうかのテストを兼ね Windows 7 での開発と XP での開発を行き来。
いまのところ Windows 7 では動作改善したが、Windows XP では動作が改善されない。
不思議なことにクラッシュする場合データサイズに影響されるのだけど、サイズが大きいと必ずクラッシュするわけではなく。例えば30Kb で落ちないのに 20kb 読み込むと落ちたり現象はマチマチ。原因は ntdll.dll で、つまりメモリ領域の動的確保でなにか悪さしてる。
ヒープとは何か?
参考URL:ヒープ : 喜びと苦悩.
とてもよくまとまった内容で参考になったのが上記 URL。
以下は上記URLからの部分抜粋
ここから抜粋
ヒープは、プログラムが使用するオブジェクトを動的に割り当てたり、解放したりしています。 Windows NT において、Win32 ヒープは Windows NT ランタイム アロケータを取り巻く薄い層です。すべての API は NTDLL へ要求を転送します。 NTランタイムアロケータ=NTDLL.dll一般的なヒープ機能の問題
- 割り当て操作の結果として、スローダウンが起こる
- 解放操作の結果として、スローダウンが起こる
- ヒープの競合によりスローダウンが起こる
- ヒープの破損によりスローダウンが起こる
- 頻繁な alloc および realloc によりスローダウンが起こる
ここまで抜粋
上記を見て考えると
ヒープ競合と頻繁な alloc および realloc が怪しい。
しかし頻繁と言っても大きめ確保は心がけていたのでヒープ操作の使用回数を減らすことは最初から念頭にあったはず。もっと大胆にメモリを使って良いのか悩むところ。
実際ヒープ操作回数を減らすようにしたら Win 7 での動作は改善した。しかし XP では効果無かった。汎用だとどうしてもこういう部分で大きめのマージン取っておかないとダメなのだろうか。小さいデータを処理する場合は無駄だし、でかいデータ扱うときは落ちるし、でも落ちるよりマシだからでかく取るしか無さそう。