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

C++全局函数my_divide的std::bind传参、内存分配及地址稳定性问题

关于std::bind绑定全局函数的三个问题解答
// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // binding functions:
  auto fn_five = std::bind (&my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '\n';                          // 5

  MyPair ten_two {10,2};

  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  std::cout << bound_member_fn(ten_two) << '\n';           // 20

  return 0;
}
  • 将全局函数my_divide的地址传递给std::bind是否合法?
    完全合法。std::bind本身就支持普通函数指针作为可调用目标,只要函数签名和绑定后的参数逻辑匹配即可,示例中的用法完全符合C++标准,编译运行都不会有问题。

  • 全局函数my_divide的内存分配在堆、栈还是BSS段?
    全局函数的机器码会被分配到代码段(Text Segment),不属于堆、栈或BSS段:

    • 堆用于程序运行时动态分配的内存(比如new/malloc申请的空间);
    • 栈用于存放局部变量、函数调用栈帧等;
    • BSS段用于存放未初始化的全局变量和静态变量;
    • 代码段是只读区域,专门存放可执行的机器指令,函数的代码就存在这里。
  • 其地址在运行时是否会发生变化?
    分两种情况:

    • 若系统开启了ASLR(地址空间布局随机化),程序每次启动时,代码段的加载基地址会被随机偏移,因此my_divide的地址在不同的运行实例中会不一样;
    • 若关闭ASLR或系统不支持该特性,函数地址在每次运行时都是固定的;
      但无论ASLR是否开启,在同一个程序运行实例中,my_divide的地址自始至终都是固定不变的。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 02:56:26