【发布时间】:2009-10-28 22:38:22
【问题描述】:
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Sin(double a);
这是什么原因?
【问题讨论】:
[MethodImpl(MethodImplOptions.InternalCall)]
public static extern double Sin(double a);
这是什么原因?
【问题讨论】:
MethodImplOptions.InternalCall 表示该方法由公共语言运行时本地实现。这对数学运算很有意义,因为它们通常针对目标平台进行了大量优化。例如,在 x86 架构中,有一条指令可以计算正弦和余弦。托管实现不太可能直接利用此类指令。
【讨论】:
sin,该调用也会由编译 CLR 代码库的编译器进行优化。 2. 属性在 IL 中当然是可见的,但是方法的 body 根本没有 IL。正如我所说,该方法是 CLR 的一部分,因此它对已实现的方法有深入的了解。当 JIT 编译器看到这样的方法时,会用自己的方法替换调用。
很可能是因为实现是优化的本机代码。
【讨论】:
实现是在本机中完成的。这不只是Sin,也看看常见的字符串操作。
CLR 知道这些方法,并维护一个“调用表”。当它看到来自 Math.Sin 的调用时,它通过“查找”调用表将其重定向到本机实现。如果你想找到更多,在转子源中搜索ecall.cpp,或者直接去here(谷歌代码搜索)。
【讨论】: