【问题标题】:C# - Why does a class, new() constraint use Activator.CreateInstance<T>()? [duplicate]C# - 为什么类 new() 约束使用 Activator.CreateInstance<T>()? [复制]
【发布时间】:2015-12-09 19:10:06
【问题描述】:

我刚刚问了C# - How do generics with the new() constraint get machine code generated?

想了一会儿,我想知道为什么 C# 编译器会发出那样的 IL。

为什么不能说一些类似的 IL:“调用 T 的默认构造函数”?

【问题讨论】:

  • 可能导致类型 T 直到运行时才知道
  • 如果没有默认构造函数怎么办?
  • 如果它没有默认构造函数,则不能将其与需要存在的方法一起使用。
  • 重复中的答案中的博文信息量很大-simple-talk.com/blogs/2010/11/17/…
  • 这不是重复的,那篇文章只是给出了一些 IL 推理,我问为什么不呢?

标签: c# clr jit


【解决方案1】:

CIL 中没有这样的指令 (http://www.ecma-international.org/publications/standards/Ecma-335.htm)。

假设我们可以添加一个,另一种实现可能是在 Type 的 VTable 中,我们将默认构造函数索引为索引 0,然后 JIT 可以假设此信息并发出执行 VTable 查找的代码,选择索引 0 并调用 VTable 中该条目 0 指向的地址处的函数。

如您所见,这需要更改 CLR 数据结构,可能需要更改每个对象的布局,并且可能需要为值类型提供不同的解决方案(我忽略了这种情况,因为您特别提到了 class 和 new()。

【讨论】:

  • 并且 JIT 可以优化 CreateInstance 调用,从而获得最佳性能。不知道这是否正在执行。可能不是,因为我们谈论的是 .NET JIT。如果有疑问,可以肯定它不会优化。更新:原来 C# 编译器做了这个优化的一部分,因为 JIT 失败了:simple-talk.com/blogs/2010/11/17/…
猜你喜欢
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
  • 2012-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多