c++--静态联编--动态联编
静态联编
定义
在编译阶段就确定了函数调用将执行哪个具体的函数实现。
原理
这个机制的核心原理在于编译器能够在编译时根据函数签名(包括函数名、参数类型和数量)来决定调用哪一个函数。
以下是这一过程的基本原理:
函数签名
函数签名由函数名称、参数的类型和顺序组成,但不包括返回值类型。
编译时解析
生成独一无二的函数签名:为了支持函数重载,编译器会对函数名进行修改,加入参数类型的编码信息,以生成一个唯一的内部标识符。例如,在C++中,对于同一个函数名的不同重载版本,编译器会基于其参数列表生成不同的函数签名,确保每个重载版本都有一个独一无二的名字。
函数调用类型检查:编译器在编译过程中会检查每个函数调用对应的参数类型是否与某个函数声明中的参数类型相匹配。当找到匹配项后,编译器就能确定该调用具体对应的是哪个函数实现。
插入函数地址:一旦编译器确定了函数调用所对应的函数实现,它会在目标代码中插入一条直接跳转到该函数起始地址的指令。这意味着在程序运行时,无需额外的计算或查找即可直接执行相应的函数代码。
使用场景
函数重载
动态联编
定义
函数调用与函数实现的关联是在运行时才确定的。
原理
虚函数/多态的原理--链接
虽然虚函数地址是在编译阶段确定,但是虚函数需要通过虚函数指针查询找到之后,才能调用,而虚函数指针属于类对象成员,而类对象实在运行阶段分配内存实例化的。
变量实例化
函数内存分配
使用场景
动态多态