zoukankan      html  css  js  c++  java
  • 早绑定和迟绑定技术的通俗分析

    概念:

    早绑定指的是在编译阶段进行绑定

    迟绑定指的是执行阶段绑定


    样例:

    Class Base

    {

    void fun(){}

    }

    Class Bind :Class Base

    {

    Void fun(){}

    }

    main()

    {

    Base base;

    base->fun();

    Bind *tmp;

    tmp  = &base;

    tmp->fun();

    }


    上面的样例说明大家一个是不是有语法问题,事实上我是有益的,fun函数被覆盖了

    先来说说base->fun();是怎么一个过程吧。


    程序执行时创建了base对象。base->fun();算什么呢?

    假设你理解成对象对调用了对象中的函数的话,那就变成执行时去找到函数了。那说好的早绑定呢?

    c++编译时。base->fun()事实上等价于fun(base),这样一看不就是函数地址吗!确实是函数地址,

    这也间接说明了c++中的成员函数就是一个唯一全局地址。而对象就是一个被隐藏了的入參。


    早绑定指的是在编译阶段就决定了怎样调用。编译确定了调用地址。当然就确定了调用方式,所以说是早绑定。

    tmp->fun为什么会调用Bind的fun函数,是由于c++通过函数名+变量类型+变量个数来唯一确定全局唯一函数。

    这也是为什么c++函数的调用设计方式和c不一样的原因吧。


    事实上当你正在理解了早绑定技术。我觉得自己也能够搞定迟绑定技术。

    迟绑定就是用来解决多态特性的(多态特性这里不做说明)

    迟绑定也就是说就算赋值了,也能正确的调用正确的函数。

    c++的解决方式是:

    当调用函数时检查到了一个特殊标记(virtual),就不直接调用地址了,就中base对象中取出一个vptr。

       vptr指向了虚表。这样就能够正确的找到函数进行调用了。也就是绕一下并且,

       当然说起来简单,实现这种功能还是有难度的。


        替代的解决方式:

         直接把虚函数保存到对象中,检查到特殊标记(vitrual)时,直接得到函数地址进行调用,

    当让我想的方案是不成熟了。仅仅是为了说明迟绑定就是我们寻常也常常会用到的技术。并

    不是神奇的。特殊的,复杂的。

  • 相关阅读:
    Nuxt.js 踩坑记录(2) 使用sequelize时,提示install mysql2,安装了仍然不能解决问题
    Nuxt.js 踩坑记录,(1)引入fs包报错
    JS手写call、bind、apply
    手写Promise简易版
    generator函数
    ["1","2","3"].map(parseInt)结果
    改变对象转换为原始值的方式
    instanceof判断问题
    e.target和e.currentTarget区别
    java设计模式--适配器模式
  • 原文地址:https://www.cnblogs.com/yjbjingcha/p/6985407.html
Copyright © 2011-2022 走看看