> 文章列表 > C++:std::function模板类(前言):为什么有了函数指针还需要Functional

C++:std::function模板类(前言):为什么有了函数指针还需要Functional

C++:std::function模板类(前言):为什么有了函数指针还需要Functional

为什么有了函数指针还有 Functional

  • 1: 函数指针定义
  • 2: 函数指针结论
  • 3:疑问
  • 4: Function来源

1: 函数指针定义

在C++中可以使用指针指向一段代码,这个指针就叫函数指针,假设有下面一段代码

#include<iostream>
int func(int a) {return a+1;
}void main()
{// 定义一个函数,然后使用指针变量f指向该函数int (*f)(int) = func;printf("%p\\n",f);
}

我们编译上述代码,得到 汇编和机器码

在这里插入图片描述
C++:std::function模板类(前言):为什么有了函数指针还需要Functional
💚💚💚
0x401156

得到的地址为:这个地址正好是 编译好的函数 func 所在的地址 : ox401156
而函数指针打印的地址也是这个。

2: 函数指针结论

实际上函数指针本质也是一个指针,只不过这个指针指向的不是内存中的一段数据而是内存中的一段代码。
C++:std::function模板类(前言):为什么有了函数指针还需要Functional
🧡🧡🧡

  1. 我们常说的指针一般都是指向内存中的一段数据,而函数指针指向了内存中的一段代码
  2. 在这个示例中指向了内存地址 ox401156
  3. 在这个地址中保存了函数func的机器指令。

3:疑问

为什么编译器在生成可执行文件时就知道函数func存放在内存地址0x400526上呢?这不应该是程序被加载到内存后开始运行时才能确定的吗?

4: Function来源

函数指针的作用是可以把一段代码当做一个变量传来传去,它的主要作用就是回调函数。
如:关于回调函数其实是在A模块定义,在B模块被调用,就像这样。
C++:std::function模板类(前言):为什么有了函数指针还需要Functional
这是一个很简单的场景,但是我们设想一下,有如下场景:
我们需要在模块A 中定义函数,同时函数A的运行需要依赖B模块,然后将模块A的函数和 模块B的数据一并传给 C模块来调用,就像这样 :

C++:std::function模板类(前言):为什么有了函数指针还需要Functional