C++函数绑定时机:发生在函数指针赋值还是调用阶段?
关于C++函数绑定的疑惑与分析
核心疑问
梳理C++函数绑定概念时的核心困惑:
- 函数绑定的定义是为函数分配地址?还是仅指代函数调用时的操作?
- 绑定究竟发生在何时?
测试程序
#include <iostream> int one() { return 1; } int main() { // 1. 是否在函数指针赋值函数地址时发生绑定 int (*one_ptr)() = one; // 2. 还是在函数调用时发生绑定 one_ptr(); }
需要明确:绑定是发生在函数指针赋值时?
int (*one_ptr)() = one;
还是函数调用时?
one_ptr();
汇编分析(objdump结果)
0000000000001169 <_Z3onev>: 1169: f3 0f 1e fa endbr64 116d: 55 push rbp 116e: 48 89 e5 mov rbp,rsp 1171: b8 01 00 00 00 mov eax,0x1 1176: 5d pop rbp 1177: c3 ret 0000000000001178 <main>: 1178: f3 0f 1e fa endbr64 117c: 55 push rbp 117d: 48 89 e5 mov rbp,rsp 1180: 48 83 ec 10 sub rsp,0x10 1184: 48 8d 05 de ff ff ff lea rax,[rip+0xffffffffffffffde] # 1169 <_Z3onev> 118b: 48 89 45 f8 mov QWORD PTR [rbp-0x8],rax 118f: 48 8b 45 f8 mov rax,QWORD PTR [rbp-0x8] 1193: ff d0 call rax 1195: b8 00 00 00 00 mov eax,0x0 119a: c9 leave 119b: c3 ret
函数指针赋值阶段的汇编
lea rax,[rip+0xffffffffffffffde] # 1169 <_Z3onev> mov QWORD PTR [rbp-0x8],rax
这段代码通过RIP相对寻址,将one()的地址加载到rax寄存器,再存入栈上的局部变量(即函数指针one_ptr),此时one_ptr已经和one()的地址建立了关联。
函数调用阶段的汇编
call rax
这是间接函数调用,只是通过rax中已存储的地址,跳转到目标函数执行,并没有在这个阶段完成绑定。
结论
- 绑定时机:函数绑定发生在函数指针赋值阶段。当执行
int (*one_ptr)() = one;时,函数指针one_ptr就被绑定到one()的地址,后续的调用只是使用这个已绑定的地址发起执行。 - 绑定类型:这属于静态绑定。因为
one()是普通非虚函数,它的地址在编译链接阶段就已经确定,赋值给函数指针时只是将编译期已知的地址存储起来,整个绑定过程不需要运行时动态确定目标函数。
内容的提问来源于stack exchange,提问作者Happy Jerry
相关产品推荐
相关产品推荐

