5

アンマネージ コードとメモリ管理の複雑さを幸いなことに無知な人のために、この文を翻訳してくれる親切な人はいますか?

このバッファーのストレージは、サイズが 64 KB のプロセスの共有ヒープから割り当てられます。バッファーの最大サイズは、ヒープの使用状況によって異なります。

WriteConsoleなどの数十の MSDN ページに存在しますが、そのような配列が爆発する前に許可される最大サイズを計算する API を見つけることができません。経験的に、61 から 62.5 KB の間のどこかにあることがわかります (64 、63、62 などDllImportの設定を停止するまでSetLastError)。GetTotalHeapSize(Windows のバージョン、プラットフォーム アーキテクチャ、デフォルトなどに依存しない const 64KB でない場合) などのようなものはありGetCurrentHeapInUseますか? それと他の P/Invoked メソッドに渡すことができる最大バイト数を取得するにはどうすればよいですか?

4

1 に答える 1

4

これはヒープの仕組みではありません。彼らはあなたが行うことができる最大の割り当てを追跡しません. ヒープが断片化する可能性があるため、これは予測できません。空きブロックは、割り当てられたブロックとインターリーブされる場合があります。たとえば、単一の小さな割り当てを解放すると、使用可能なスペースが突然 2 倍になる場合があります。アンマネージ ヒープには、マネージ ヒープのような余裕がなく、圧縮できません。ただし、.NET ラージ オブジェクト ヒープにもこの問題があります。使用可能な最大スペースを測定する関数はありません。そのスレッドセーフにすることは不可能です。

できることは何もありませんが、できない場合は結果を割り当てて対処するようにしてください

于 2013-04-15T23:48:48.367 に答える