首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >早期绑定和后期绑定有什么区别?

早期绑定和后期绑定有什么区别?
EN

Stack Overflow用户
提问于 2008-08-14 02:10:54
回答 6查看 108.4K关注 0票数 95

早期绑定和后期绑定有什么区别?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-08-14 02:24:04

简而言之,早期(或静态)绑定指的是编译时绑定,而后期(或动态)绑定指的是运行时绑定(例如,当您使用反射时)。

票数 65
EN

Stack Overflow用户

发布于 2015-05-23 08:37:47

类似但更详细的答案来自赫伯特·斯奇尔特的C++一书:

早期绑定是指在编译时发生的事件。本质上,当在编译时知道调用函数所需的所有信息时,就会发生早期绑定。(换句话说,早期绑定意味着在编译期间绑定对象和函数调用。)早期绑定的示例包括普通函数调用(包括标准库函数)、重载函数调用和重载操作符。早期绑定的主要优点是效率。因为调用函数所需的所有信息都是在编译时确定的,所以这些类型的函数调用非常快。

早期绑定的对立面是后期绑定。后期绑定是指直到运行时才解析的函数调用。虚函数用于实现后期绑定。正如您所知道的,当通过基指针或引用进行访问时,实际调用的虚拟函数由指针所指向的对象类型决定。因为在大多数情况下,这不能在编译时确定,所以对象和函数直到运行时才被链接。后期绑定的主要优点是灵活性。与早期绑定不同,后期绑定允许您创建程序,这些程序可以响应程序执行时发生的事件,而不必创建大量的“应急代码”。请记住,由于函数调用直到运行时才被解析,因此后期绑定可能会使执行时间稍慢一些。然而,今天,快速的计算机已经大大减少了与后期绑定相关的执行时间。

票数 7
EN

Stack Overflow用户

发布于 2008-08-14 02:21:56

在解释型语言中,差异要稍微细微一些。

Ruby:

代码语言:javascript
复制
# early binding:
def create_a_foo(*args)
  Foo.new(*args)
end
my_foo = create_a_foo

# late binding:
def create_something(klass, *args)
  klass.new(*args)
end
my_foo = create_something(Foo)

因为Ruby (通常)是不编译的,所以没有编译器来做这些漂亮的前期工作。然而,JRuby的发展意味着现在有更多的Ruby被编译,这使得它的行为更像上面的Java。

IDE的问题仍然存在:如果您对类定义进行硬编码,像Eclipse这样的平台可以查找它们,但是如果您将它们留给调用者,则不能。

控制反转在Ruby中并不是特别流行,可能是因为其极端的运行时灵活性,但Rails很好地利用了后期绑定来减少运行应用程序所需的配置量。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档