摘自C#大牛的话:
方法(Method)是类型定义,所以它存储在Type Object上,Type Object
它是分配在托管堆上的特殊类型。 在同一个AppDomain中,每种类型对应一个全局Type
目的。 引用类型的每个实例都包含一个指向其直接类型 Type Object 的指针,并且每个 Type Object
还有一个类似的指针,用于标记其直接父类型的Type Object。
当调用静态方法时,CLR会根据方法调用找到其对应的Type Object,然后JIT该方法,JIT
下面的方法是本机代码php 释放内存,可以直接运行。 然后,将这部分代码加载到显存中,将方法的参数加载到当前执行栈中,同时将原来的执行上下文地址也记录到执行栈中; 方法开始执行,执行完后,读出执行栈中的返回地址,然后
CLR使用本机跳转指令跳转到返回继续执行。
当调用实例方法时,CLR会根据实例的Type Object指针找到对应的Type Object,然后JIT该方法,JIT
下面的方法是本机代码,可以直接运行。 然后,这部分代码被加载到显存中,实例对象,以及技巧的参数被加载到当前执行栈中
(实例对象始终是第一个参数arg0,使用ldarg0
指令被读取),原来的执行上下文地址也被记录到执行栈中; 方法开始执行,执行完后读取执行栈中的返回地址,然后CLR
使用原生跳转指令,跳转到这个返回继续执行。
如果该方法已经进行过 JIT 处理,则不会进行第二次 JIT 处理。
该方法在IL中以字节流的形式存在,因此仍然会占用显存。
然后,方法 JIT 将驻留在进程的地址空间中,因此它也会在运行时获取视频内存。
注意:JIT是及时编译器
对于PHP来说,只有在访问的时候才传输到显存,所以静态方法和实例方法是一样的。使用哪个取决于你的设计
我去SO帮你问,Should I避免在PHP中使用太多静态方法吗?,老外说从OOP的角度来看,应该避免使用太多静态方法。 在这个时代php 释放内存,你不需要太关注显存的消耗(当然,糟糕的代码还不够)。
看来,老外的看法和我一样! ! (遗憾的是,PHP 在调用之前加载所有方法,这与 .NET 不同)