【发布时间】:2010-03-10 18:51:30
【问题描述】:
绑定的一个定义是,它是将函数名替换为内存地址的行为。
a) 因此,我假设早期绑定意味着函数调用在编译过程中被内存地址替换,而后期绑定这种替换发生在运行时?
b) 为什么虚拟方法也被认为是早期绑定(因此在编译时找到目标方法,并创建将调用此方法的代码)?据我所知,对于虚拟方法,对实际方法的调用仅在运行时解决,而不是编译时解决?!
感谢
编辑:
1)
A a=new A();
a.M();
据我所知,在编译时不知道在运行时将在堆上的哪个位置(因此在哪个内存地址)将实例 a 创建。
现在,通过早期绑定,函数调用在编译过程中被替换为内存地址。但是编译器如何用内存地址替换函数调用,如果它不知道在运行时将在堆上的哪个位置创建对象a(这里我假设方法a.M的地址也将在相同的内存位置作为a)?
2)
v-table 调用既不早绑定也不晚绑定。相反,函数指针表中有一个偏移量。偏移量在编译时是固定的,但是从哪个表中选择函数指针取决于对象的运行时类型(对象包含指向其 v-table 的隐藏指针),因此在运行时找到最终的函数地址。
但是假设 T 类型的对象是通过反射创建的(因此应用程序甚至不知道 T 类型的存在),那么在编译时如何存在该类型对象的入口点?
【问题讨论】:
-
我不确定 C# 是否是一个正确的标签,因为 C# 至少在加载时间之前不会进行任何绑定。
标签: c#