缓冲区是从共享堆中为64 KB大小的进程分配的吗?

Ily*_*kov 5 c# heap pinvoke winapi

对于那些幸福地无知非托管代码和内存管理错综复杂的人来说,有人会善意地翻译这句话吗?

此缓冲区的存储空间是从共享堆中为64 KB大小的进程分配的.缓冲区的最大大小取决于堆的使用情况.

它存在于几十个MSDN页面上,例如WriteConsole,但我找不到任何可以计算这个数组在爆炸之前允许的最大大小的API,根据经验我可以告诉它在61到62.5 KB之间(通过调用64 ,63,62等,直到它停止设置DllImport's SetLastError).是否有类似的东西GetTotalHeapSize(如果它不是一个独立于Windows版本,平台架构,默认值等的const 64KB)和类似的东西GetCurrentHeapInUse?如何获得我可以传递给那个和其他P/Invoked方法的最大字节数?

Han*_*ant 4

这不是堆的工作方式。他们不会跟踪您可以进行的最大分配。这是不可预测的,因为堆可能会变得碎片化。空闲块可以与分配的块交错。例如,释放单个小分配可能会突然使可用空间增加一倍。非托管堆没有托管堆的优势,它们无法压缩。尽管.NET 大对象堆也存在这个问题。没有函数来测量最大可用空间,不可能使其成为线程安全的。

如果你做不到,你只能尝试分配和处理后果。