c# - IEnumerator.ToArray() 是如何实现的?
问题描述
对于IEnumerator.ToList()
, 似乎很明显它将迭代MoveNext()
, Add(Current)
, 直到遇到终点。
但是对于 Array,我没有看到任何聪明的方法来做到这一点。在不知道 IEnumerator 的计数的情况下,它将一次又一次地创建数组,将它的长度增加 1,MoveNext()
直到它遇到结束。我敢肯定,这绝对不是这种方式。
内部如何ToArray()
实施?
解决方案
真的没有什么神奇的,结果缓冲区以 a 的方式增长List<T>
(确切的代码取决于您使用的框架和版本),但它仍然是相同的。
缓冲区大小将从 size 开始,
4
并且每次需要容量时都会将大小增加一倍。例如8, 16, 32, 64, ...
每次它增加时,它将使用快速的内存(样式)副本来传输数据。
最终结果将分配和复制它需要的大小。
是的,有分配,枚举的结果越大,它执行的分配就越多,尽管即使在最坏的情况下它们也是最小的。
注意:如果你想减少代码中的分配,那么最好远离不断增长的缓冲区和导致它们的神奇野兽
推荐阅读
- elasticsearch - ElasticSearch - 嵌套字段的聚合以返回存储桶中的附加字段
- python - 烧瓶中的简单 python API 问题。尝试创建一个 post 方法将 json 数据添加到列表中
- java - Log4j2 无法发送邮件
- arrays - 更新反应 js 中的数组值 - shopify 北极星反应
- mysql - 使用 MySQL 聚合连接
- apache - 直接访问时,重写规则对 https 工作正常,但在首先从 http 重定向到 https 时不能正常工作
- dialogflow-es - Intent 之间的全局变量或上下文 - Dialogflow
- docusignapi - Docusign:获取访问令牌
- postgresql - 如何在 docker exec bash 命令中转义引号
- ios - SF Symbols 多彩多姿的图标