绑定是在多个上下文中使用的单词.它总是与一件事物与另一件物品的连接有关,但是当结合行为发生时可能会有所不同.
有一个绑定时间的概念或某个组件绑定到某个其他组件的点.绑定时间的基本列表是:(1)在编译时绑定,(2)在链接时绑定,(3)在加载时绑定,以及(4)在运行时绑定.
编译源代码时编译时发生绑定.对于C/C++,有两个主要阶段,预处理器执行源文本替换,例如定义替换或宏替换,以及源文本的编译,将源文本转换为机器代码以及链接器的必要指令.
链接时的绑定是指外部符号链接到一组特定的目标文件和库.您可能有几个不同的静态库,它们具有相同的函数名称集,但函数的实际实现是不同的.因此,您可以通过选择不同的静态库来选择要使用的库实现.
加载时绑定是指加载程序将可执行文件与任何动态或共享库一起加载到内存中.加载器将函数调用绑定到特定的动态或共享库,并且所选择的库可以变化.
运行时绑定是程序实际运行的时间,并根据当前执行的线程进行选择.
因此,链接实际上只是绑定类型之一.看看这个stackoverflow 静态链接与动态链接,它提供了有关链接和库的更多信息.
您可能也对std::bindC++ 感兴趣,所以这里有一个stackoverflow文章std :: function和std :: bind它们应该被使用的是什么.
等待事物之前等待的时间越长,就可以提供软件使用方式所需的灵活性.然而,通常在延迟绑定和运行时效率以及源的复杂性之间存在折衷.
有关绑定时间的示例,请考虑打开文件并从文件读取然后关闭它的应用程序.当文件名绑定到文件打开时,您可以选择几个不同的时间.
您可能在编译时硬编码文件名,绑定,这意味着它只能与该文件一起使用.要更改文件名,您必须更改源并重新编译.
您可能具有用户输入的文件名,例如使用用户提示符或命令行参数,将文件名绑定到运行时打开的文件.要更改文件名,不再需要重新编译,只需使用不同的文件名再次运行程序即可.
假设您有一个函数声明为:
void f(int, char);
Run Code Online (Sandbox Code Playgroud)
也可以是:
void f(int);
Run Code Online (Sandbox Code Playgroud)
然后你用正确的签名调用函数 f(4) 。这就是绑定。链接器将链接到函数体的可用定义,以便 f 与签名 void f(int) 匹配;