有没有人愿意为那些对非托管代码和内存管理的复杂性一无所知的人翻译这句话?
The storage for this buffer is allocated from a shared heap for the process that is 64 KB in size. The maximum size of the buffer will depend on heap usage.
它出现在几十个 MSDN 页面上,例如WriteConsole ,但我找不到任何 API 来计算这种数组在爆炸前允许的最大大小,根据经验我可以告诉它它在 61 到 62.5 KB 之间(通过调用 64、63、62 等直到它停止设置 DllImport
的 SetLastError
)。是否有类似 GetTotalHeapSize
的东西(如果它不是独立于 Windows 版本、平台架构、默认值等的 const 64KB)和类似 GetCurrentHeapInUse
的东西可用?如何获得我可以传递给该方法和其他 P/Invoked 方法的最大字节数?
最佳答案
这不是堆的工作方式。他们不会跟踪您可以进行的最大分配。这是不可预测的,因为堆可能会碎片化。空闲 block 可以与分配的 block 交织。例如,释放一个小的分配可能会突然使可用空间翻倍。非托管堆没有托管堆的优势,它们不能被压缩。尽管.NET Large Object Heap 也有这个问题。没有衡量最大可用空间的函数,不可能做到线程安全。
你只能尝试分配和处理你做不到的后果。
关于c# - 缓冲区是从共享堆中为大小为 64 KB 的进程分配的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16025990/