链接和绑定有什么区别?
假设你有一个函数声明为:
void f(int, char);
,也可以作为:
void f(int);
你调用函数f(4)正确的签名。这是绑定。 链接器将与函数体的可用定义链接,用于与签名void f(int)进行f匹配;
绑定是一个在多个上下文中使用的单词。然而,当绑定行为发生变化时,它始终与一个事物与另一个事物的连接有关。
有一个绑定时间的概念或某个组件绑定到某个其他组件的点。绑定时间的基本列表是:(1)在编译时绑定,(2)在链接时绑定,(3)在加载时绑定,以及(4)在运行时绑定。
编译时的绑定发生在源代码编译时。对于C/C++,有两个主要阶段,预处理器执行源文本替换,如定义替换或宏替换,以及汇编将源文本转换为机器代码的源文本以及链接器的必要指令。
链接时的绑定是当外部符号链接到一组特定的目标文件和库时。您可能有几个不同的静态库具有相同的函数名称集,但函数的实际实现是不同的。所以你可以通过选择不同的静态库来选择使用哪个库实现。
加载时的绑定是加载器将可执行文件与任何动态或共享库一起加载到内存中的时间。加载器将函数调用绑定到特定的动态库或共享库,并且所选库可能会有所不同。
运行时绑定是程序实际运行时根据当前执行线程作出选择。
所以连接实际上只是绑定的一种类型。看看这个提供更多关于链接和库信息的stackoverflow static linking vs dynamic linking。
您可能也有兴趣std::bind
在C++中,所以这里是一个stackoverflow文章std::function and std::bind what are they when they should be used。
在某些东西被绑定到其他东西之前,您等待的时间越长,可以为软件的使用方式提供所需程度的灵活性。然而,在延迟绑定和运行时效率以及源代码的复杂性之间经常存在折衷。
有关绑定时间的示例,请考虑打开文件并从文件读取然后关闭该文件的应用程序。当文件名被绑定到打开的文件时,您可以选择几个不同的时间。
您可能会在编译时对文件名进行硬编码,这意味着它只能与该文件一起使用。要更改文件名称,您必须更改源文件并重新编译。
您可能必须通过用户输入的文件名,如与用户提示或命令行参数,文件名绑定到该文件在运行时开放。要更改文件名称不再需要重新编译,只需使用不同的文件名再次运行该程序。
实际上它们在c编程中都有相同的含义。有些人使用绑定,其他人使用链接。
如果你想知道链接是什么,那么这里是一个简短的解释。
假设你已经做了一个用户定义的函数调用的总和(),其声明是根据 INT总和(INT,INT);然后每当从程序调用函数时,程序应该知道在内存中跳转到何处执行该函数。简单地说,函数的地址应该被你的程序知道,以便到达它的被称为绑定的主体。
现在sum是用户定义的函数,所以它会出现在你的源代码中。如果它从main()被调用,那么它将在编译时被链接到main,因为那时编译器会知道你的函数在可执行文件中的位置。这称为静态绑定。
现在想想printf()这是库函数,它的主体不在你的程序中。所以编译程序时,printf的主体将不会出现在您的编译可执行文件中。当你执行你的程序时,它将被加载到内存中,并且它的地址在运行时会被main所知,而不是在sum()的情况下在编译时被知道。这种类型的链接称为动态链接。
您是否试过寻找答案。这里是https://www.google.co.in/?gfe_rd=cr&ei=Nf4vVObDKqLM8gedwIHIBg#q=What+is+the+difference+between+linking+and+binding – Rahul 2014-10-04 14:04:30