// 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 是否有效? my_divide 全局函数的内存从哪里分配在堆或堆栈或 BSS 段上,全局函数的地址是否会在运行时改变?
在 C++ 中,“堆”是一个不精确的术语,表示由
new
(通常)或 malloc
(对于遗留 C 行为)返回的内存。由于多种原因,它是不精确的,其中一个原因是只有一个堆(“THE”堆)的想法。同样,“堆栈”也是不精确的。它用于函数局部变量,即使 CPU 实际上并不将这些变量存储在 CPU 堆栈上。
但是这是两种类型的动态内存,具有可变的生命周期。函数永远存在并且不会移动(指针不会改变)。对于每个永远存在的 C++ 对象来说也是如此。所以你无法弄清楚内存从哪里来,也不需要关心,因为你不需要归还那段内存。