【发布时间】:2015-11-13 23:48:17
【问题描述】:
请考虑以下情况。
如您所知,在 Main() 执行之前,CLR 为 Main() 中的每个引用类型分配一个内部数据结构,其中包含引用类型中定义的每个方法的条目。随后,每个条目保存对存储各自本机代码的内存块的引用(存根)。
假设在 Main() 中执行代码时,JITter 遇到了一个方法 SomeClass1.M1()。引用 SomeClass1 来查找相关的 IL 代码。
所以这里有问题:
- 当 CLR 在 M1() 中遇到另一个方法调用时会发生什么,比如说 SomeClass2.M2()。是否意味着创建了包含 SomeClass2 方法的第二个数据结构,然后将本机代码的地址绑定到相应的方法?如果是,那么:
- 第一个数据结构中将存储什么?
- 如果 M1() 的描述立即以调用 M2() 开始,并且在 M2() 之后还有一些代码在 M1() 中,则将存储在第一个数据结构中的内容。
不幸的是,我在网上找到的只是一个描述,说方法的 IL 代码只是编译成本机代码,然后被执行。
因此,如果我的假设不正确,请提出您的意见。
谢谢!
【问题讨论】:
-
这个问题很难回答。您可能想查看 JIT source code。