首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中,何时对数组执行填零操作?

在C#中,何时对数组执行填零操作?
EN

Stack Overflow用户
提问于 2012-02-03 17:56:36
回答 3查看 294关注 0票数 2

在C#中考虑这一点:

代码语言:javascript
复制
int[] a = new int[1024];

所有整数都将设置为0。传统上,这是通过高度优化的填零操作(例如memset)来完成的。然而,由于这个数组是由CLR分配的,所以我可以想到一个非常简单的优化方法;CLR可以维护一个置零的内存区,以便在我们请求内存时跳过这种填零操作。

现在,CLR会执行这样的优化吗?(我目前使用的是.NET 4.0)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-03 21:55:37

这是在一个低得多的层次上运行的。Windows使低优先级内核线程保持活动状态,其唯一的任务是将内存页的内容清零。称为“零页线程”。这些页面保存在一个池中,可供为保留但未提交的页面生成页面错误的任何进程使用。Windows中的任何代码都会从中受益,而不仅仅是托管代码。这样做的目的是为了安全,而不是将映射内存页面的RAM内容置零,这将允许一个程序窥探另一个进程的内存。

这不会发生在你的数组上,它太小了。它被分配到gen #0堆中,这个堆总是有映射的页面。然而,大型数组在大型对象堆中分配,大型是85,000字节,对于双精度数组,8,000字节。LOH分配可以利用将页面预初始化为零的优势。很难说它是否真的做到了,它的源代码在任何地方都找不到。我想说,考虑到它节省的cpu周期的数量,它很可能是这样的。

票数 2
EN

Stack Overflow用户

发布于 2012-02-03 19:45:09

CLR只分配一个超出托管堆消耗的bit more memory,如果它耗尽了托管堆的未分配内存,它将从操作系统请求更多内存。只有当你的进程设置的内存已经很大,并且你有很多未使用的内存被垃圾回收时,预清零才能发挥作用。然后可以从托管堆中释放该内存以供分配。如果您的应用程序是这种情况,那么您应该考虑重用数组,而不是删除它,以避免在托管堆上重新分配。

票数 2
EN

Stack Overflow用户

发布于 2012-02-03 20:00:37

你有没有看过为这段代码生成的IL?可能会为有问题的调用生成对newarr的调用。根据ECMA-355,newarr创建一个新的从零开始的一维数组,并将该数组的元素初始化为适当类型的0。在本例中,由于它是一个int数组,因此元素在创建时将被初始化为0。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9126743

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档