大家都进来说说对静态绑定与动态绑定的理解。

yeguangyuan 2010-08-26 07:51:07
静态绑定?动态绑定?
大家都有何见解呢
...全文
252 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ithiker 2010-08-27
  • 打赏
  • 举报
回复
动态绑定是多态实现的基础
yeguangyuan 2010-08-27
  • 打赏
  • 举报
回复
感谢大家的热情讨论,真的是受益匪浅

jizhongqing:特别感谢你从汇编角度来分析,让我立即更加的透彻了
xingshuqiang2009 2010-08-26
  • 打赏
  • 举报
回复
编译时绑定时静态绑定,运行时绑定为动态绑定
kyzyyhw 2010-08-26
  • 打赏
  • 举报
回复
个人认为 静态绑定是在运行前以绑定 数据和参数不可变 动态绑定是在运行时绑定 可由用户在运行时改变
jizhongqing 2010-08-26
  • 打赏
  • 举报
回复
其中ecx为调用时使用的this指针,不是虚表
jizhongqing 2010-08-26
  • 打赏
  • 举报
回复
啥叫见解不懂,知道啥时候用就行了

从汇编的角度看所谓的静态绑定就是直接 call 一个全局的内存地址,c++中的静态函数也不例外,
动态绑定是指 call [ecx]+ offset 其中ecx为调用时使用的this指针指向的类的虚表,一般位于类对象的开头4个字节,也就是this指向的一个dword值就是虚表指针,offset为函数相对于虚表指针的偏移,其实就是在查不同的表
一个子类继承父类,那么编译器完整copy一份父类的虚表给他,然后把新copy的这个表地址填写到子类的开头,也就是子类的虚表指针,子类如果不重写父类virtual函数,则不修改这份虚表,否则改写这虚表对应项
如果子类新加一个virtual函数,则在这个虚表里添加一项,所以调用父类还是子类完全依赖于使用的this指针,因为要调用的函数地址就是 (*(PDWORD)this)[funindex]
这就是vc实现的动态绑定,其他编译器没看过
腾斯基 2010-08-26
  • 打赏
  • 举报
回复
在编译期能够决定的,就是静态绑定。运行时决定的就是动态绑定。
典型的例子就是template和virtual function。
在编译完成后,dll就会存在template类的实例,这个是静态。继承类中的虚方法只有在调用时才会通过虚表找到真正要执行的函数,这个就是动态。
baihacker 2010-08-26
  • 打赏
  • 举报
回复
语言定义
语言实现
语言翻译
链接
加载
执行

一般认为最后一个中产生的约束是动态约束,其它的是静态约束。
ztenv 版主 2010-08-26
  • 打赏
  • 举报
回复
编译时确定和运行时确定;就是静态和动态的区别

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧