假设有一种方法。在这个例子中,内存将被分配到什么地方?
class C
{
public void Method()
{
Task.Run(() => { });
}
}
在 Release 中,编译器将制作以下结构:
public class C
{
[Serializable]
[CompilerGenerated]
private sealed class <>c
{
public static readonly <>c <>9 = new <>c();
public static Action <>9__0_0;
internal void <M>b__0_0()
{
}
}
public void M()
{
Task.Run(<>c.<>9__0_0 ?? (<>c.<>9__0_0 = new Action(<>c.<>9.<M>b__0_0)));
}
}
事实证明,在类中<>c创建了一个字段<>c <>9 = new <>c()以引用<M>b__0_0. 我想是的。内存只分配<>9。
毕竟,如果你不使用羊肉:
public class C
{
public void M()
{
Task.Run(new Action(A));
}
void A() {}
}
这被编译成相同的东西,并且仅在以下情况下相应地分配内存new Action()(在第一种情况下,我们还有 field 的初始化<>9)。
很明显,lambda被隔离在一个独立的对象中,除了非静态成员,那么里面什么都没有,所以内存消耗将等于该对象在内存中的最小大小,x64为24字节,x64为12字节x86,据我所知。两个静态链接的内存 - 分别为 16 或 8 个字节,将在应用程序启动时分配。
如您所见,该对象将在整个应用程序期间创建一次。因此,创建对象所消耗的处理器时间和内存将一次性完成,随后该对象将被重用。
顺便说一句,关于这个话题,有一篇关于 Habré 的好文章。