Wil*_*l S 5 .net generics enums jit
如果我编写(或使用)泛型类,例如List,并使用两种不同的枚举类型对其进行参数化,我是否会获得两个代码JITted的副本?鉴于以下文章讨论了JITter如何为引用类型生成一个副本,以及每个值类型的一个副本,我认为这归结为"为了JITting,每个特定枚举是否被视为不同的值类型?"
http://msdn.microsoft.com/en-us/library/ms379564%28v=vs.80%29.aspx#csharp_generics_topic1
在C#代码中:
using System.Collections.Generic;
namespace Z
{
class Program
{
enum A {a}
enum B {b}
class C<T>
{
}
static void Main(string[] args)
{
var x = new C<A>();
var y = new C<B>(); // does this JIT a new C constructor for enum type B?
}
}
}
Run Code Online (Sandbox Code Playgroud)
我有兴趣知道这一般,但也特别针对.NET CF 3.5(WindowsCE)JIT编译器(编辑:因为我对可能的代码膨胀影响感兴趣).有关找到这个的最佳方法的任何建议?我正在考虑在C类中编写一个P/Invokes到本机代码的函数,在那里我可以进入调试器并检查callstack - 特别是返回地址,但也许有人可以根据我的语言规则进行权威性回答.我不知道......
所以我继续把P/Invoke函数放在一起调用C <T> .Test函数.我在本机函数中闯入调试器(支持托管和本机调试的桌面窗口),然后删除到汇编,然后从我的本机函数跟踪RET指令.RET之后的EIP(指令指针)与返回两个不同的例程一致,一个用于C <A> .Test,另一个用于C <B> .Test.通过这两个函数对公共本机函数(使用我的断点)的多次调用显示了一致的结果.此外,后RET EIP是0x2E0246和0x2E02BE,它们彼此接近,也没有映射到加载的DLL的地址空间.这向我表明它们是JITted,JITted彼此接近,并且JITted方法的大小很小(如预期的那样).
所以答案,至少在桌面上,是通过不同的枚举JIT模仿不同的例程的泛型.