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
相关产品推荐
相关产品推荐

