在c++中,内存将分配给全局函数,并且全局函数的地址会在运行时改变还是不会改变?

问题描述 投票:0回答:1
// 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++11 c++17 c++14
1个回答
0
投票

在 C++ 中,“堆”是一个不精确的术语,表示由

new
(通常)或
malloc
(对于遗留 C 行为)返回的内存。由于多种原因,它是不精确的,其中一个原因是只有一个堆(“THE”堆)的想法。同样,“堆栈”也是不精确的。它用于函数局部变量,即使 CPU 实际上并不将这些变量存储在 CPU 堆栈上。

但是这是两种类型的动态内存,具有可变的生命周期。函数永远存在并且不会移动(指针不会改变)。对于每个永远存在的 C++ 对象来说也是如此。所以你无法弄清楚内存从哪里来,也不需要关心,因为你不需要归还那段内存。

© www.soinside.com 2019 - 2024. All rights reserved.