C#vb:System.Func需要多少内存?

Pac*_*ier 6 .net c# vb.net function

究竟System.Func拥有多少内存?

如果System.Func是1行或1000行,有什么区别吗?

Han*_*ant 12

Func <>是委托类型,实例在x86抖动中占用32个字节的存储空间:

  • 对象标题为8个字节
  • Delegate._methodBase字段的4个字节
  • Delegate._methodPtr字段的4个字节
  • Delegate._methodPtrAux字段的4个字节
  • Delegate._target字段的4个字节
  • MulticastDelegate._invocationCount字段的4个字节
  • MulticastDelegate._invocationList字段的4个字节

目标方法大小不相关,委托对象仅存储方法的地址.


ang*_*son 7

这个问题在很多层面都有答案,我担心你不会得到真正100%准确的答案,但是这里有.

我想在这里关注两个不同的内存:

  1. 分配用于保存代码的内存
  2. 分配的内存代码

第一部分由JITter分配,这肯定与方法中的代码量有关.但是,如果您决定将该方法扩展到多个方法(您应该这样做,方法不应该是千行,更不用说50个),那么您还将通过这些方法分散内存.事实上,每种方法可能有一定数量的开销,所以从这个角度来看,如果你使用的方法多于一个大的方法,它最终可能会为JITted代码使用更多的内存,但这是无关紧要的.拆分它.认真.

第二块内存是代码在执行时分配的内容.这当然完全取决于代码的作用,因此没有办法说一种方法比仅根据行数判断的方法更好.1000行方法可能不会分配太多,而1行方法可能会分配很多.除了检查实际代码之外,没有办法说出来.

此外,在调试器外部运行的发布模式构建中,垃圾收集器非常具有攻击性,因此在方法顶部声明的变量填充了数据结构,然后在不再使用的方法中, GC可能会回收它,因为它可以鸟瞰你的代码.它可以"看到"该变量不再使用,因此只收集其中的任何内容是安全的.

但是,在调试期间,该变量的使用寿命会延长到持续到示波器/方法的结尾,因此如果您在代码中不再使用该变量的部分某处停止程序,您仍然可以检查它内容.

所以,得出结论:

  1. 较长的方法可能需要比较短的方法更多的JITted内存,但除非您实际上可以删除代码,而不是仅仅移动它并将其拆分,这是不相关的.写简短的方法.
  2. 该方法分配的内存与行数无关,而与这些行的内容无关.

现在,至于a System.Func<T...>,这只是一个指向小对象的指针.该对象的大小将取决于它所引用的func /方法的参数数量(如果我没记错),但是它不依赖于方法,代码或内存分配的大小等等.

正如@Marc指出的那样,.NET中的委托是启用了多播的.这是使用一系列对象解决的,因此使用的内存也将取决于该链中的元素数量.

不要担心使用委托.它们相当便宜,无论是CPU还是内存方面.