You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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中已存储的地址,跳转到目标函数执行,并没有在这个阶段完成绑定。

结论

  1. 绑定时机:函数绑定发生在函数指针赋值阶段。当执行int (*one_ptr)() = one;时,函数指针one_ptr就被绑定到one()的地址,后续的调用只是使用这个已绑定的地址发起执行。
  2. 绑定类型:这属于静态绑定。因为one()是普通非虚函数,它的地址在编译链接阶段就已经确定,赋值给函数指针时只是将编译期已知的地址存储起来,整个绑定过程不需要运行时动态确定目标函数。

内容的提问来源于stack exchange,提问作者Happy Jerry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:50:26