zoukankan      html  css  js  c++  java
  • 前期绑定和后期绑定

    以vb为例

    后期绑定:

      将对象分配给一个声明为objcet类型的变量,若将一个变量声明为variant or ojbect ,(包含as form,as control变量),vb编译时就无法确定该变量讲引用那种类型的对象,应用程序只能在运行时确定对象的属性和方法。

      使用后期绑定,每次调用属性或者方法时,vb都将成员名传给该对象IDispatch接口的方法-GetIDsOfNames方法,GetIDsOfNames返回 该成员的id或者DispId,vb程序再将DispID传给IDispathch接口的Invoke方法来调用该成员。

      对于进程外部件而言,这就意味着一次‘额外跨进程调用,调用开销增大。

      (idispatch接口:IDispatch接口把所有成员函数的入口地址放入到一个数组中,并且内部组织了一个Map,将数组索引和方法名称一一影射,DispId(COM 事件或者函数的调度 ID)就是这些方法在数组中的索引。通过DispId可以找到该方法的地址,调用该方法。

    前期绑定:

      vb在编译时就知道属性或者方法所在对象。

      前期帮定预先知道函数成员在类型中的DispID,不需要调用GetIDsOfNames方法。而且早期绑定允许程序在编译时分配内存,或者进行其他优化,从而生成更高效的应用程序。

     比较:

      可见,前期绑定的效率高于后期绑定的效率,在进程内创建对象,据说速度比例是2:3,也就是说1.5倍,本文没有实际计算。而且前期绑定,在集成开发环境下,方法成员会自动显示。前期绑定会减少运行时的错误。但前期帮定时,在vb下需要引用该dll,如果被引用的组件不存在,整个引用程序也不能运行,如果是后期绑定,只要在创建对象createobect时才会抛错。前期帮定时,如果被引用组件版本不同,可能会有兼容性问题,但是如果是后期绑定,则没有问题。

    例如:

    定义工程1中定义类clstry

    方法:

    Public Function showMessage() As String
        showMessage = "this is result"
    End Function

    1 引用工程

    Dim str As New ClsTry
        MsgBox str.showMessage

    2 不引用工程

    Dim str As Object
        Set str = CreateObject("vbpTry.ClsTry")
        MsgBox str.showMessage

  • 相关阅读:
    POJ数据结构专辑(含部分题解)
    第K小数 uva 10041 Vito's Family poj 2388 Who's in the Middle
    POJ 1195 Mobile phones (二维树状树组)
    python 学习体会
    ACM竞赛常用STL(二)之STLalgorithm
    计算机科学中的树
    ctf古典密码从0到
    漏洞挖掘的艺术面向源码的静态漏洞挖掘
    漏洞挖掘的艺术面向二进制的静态漏洞挖掘
    实战演示 H5 性能分析
  • 原文地址:https://www.cnblogs.com/yinxingyeye/p/2253992.html
Copyright © 2011-2022 走看看