kch*_*t20 1 c# buffer compiler-optimization
我在 C# 中使用 ArrayPool。我想创建自己的池,最大数组数量为 5,最大数组大小为 1050000。我使用了这个 ArrayPool.Create() 方法。我无法理解一件事 - 我试图在下面的代码片段中从池中租用 10 次,尽管我指定最大数组为 5,那么为什么它没有显示任何错误。另外,我指定最大长度为 1050000。那么我如何能够租用 4200000 的阵列而不出现任何错误?
byte[] buffer;
ArrayPool<byte> pool = ArrayPool<byte>.Create(1050000, 5);
for (int i = 0; i < 10; i++)
{
buffer = pool.Rent(4200000);
}
Run Code Online (Sandbox Code Playgroud)
传递给的选项ArrayPool.Create并不意味着您不能接收大于这些限制的数组。相反,它们用于控制 的分桶算法ConfigurableArrayPool。第二个参数是存储桶中的最大槽数,第一个参数是任何数组的最大大小。该值受到内部常量的限制,该1,048,576常量已经小于您的1,050,000.
当您Rent从数组池中取出数组时,算法将尝试在桶/槽之一中定位数组。这些存储桶(及其内部槽)的数量受到您传入的值的限制。如果池没有请求的最小大小的数组,因为所有槽都在使用中或者因为请求的大小更大超过最大值时,它将分配一个新的(不池化)并返回它。
简而言之,当您请求的数组大于传入该Create方法的(上限)大小时,您将进行分配并收到不参与池的数组。调用Return此数组不会将其放回池中;相反,它将被“丢弃”。
但请记住,这些规则仅适用于内置阵列池。您(或其他人)可以编写一个实现来限制返回数组的大小,甚至抛出异常——尽管我认为这些可能不被认为是行为良好的(至少在没有支持文档的情况下)。
根据您的评论更新:
虽然 true 没有直接对应于桶数的参数,但有间接的。存储桶的数量是使用您传入的最大数组大小来计算的。最大存储桶是根据 2 的幂和一些其他逻辑确定的。