当前位置: 首页 > 知识库问答 >
问题:

std::函数vs函数指针[重复]

班景龙
2023-03-14

> < li>

有什么不同吗?

“保存/转移”功能的最佳方式是什么?

function<void(int)> fcn = 
                    [](int par) {std::cout<<"fcn: "<<par<<std::endl; };
void(*fcn_a)(int) = 
                    [](int par) {std::cout<<"fcn_a: "<<par<<std::endl; };


fcn(12);
fcn_a(12);

共有2个答案

高嘉树
2023-03-14

对于非捕获 lambda,使用函数指针将比使用 std::函数更快。这是因为 std::function 是一个更通用的野兽,它使用类型擦除来存储传递给它的函数对象。它通过类型擦除来实现这一点,这意味着您最终会对 operator() 进行虚拟调用。

OTOH,非捕获的λ隐式转换为相应的函数指针。但是,如果您需要一个成熟的闭包,则必须尽可能将 lambda 分配给 std::函数,或者通过模板依赖类型推断。

燕野
2023-03-14

< code>std::function更加通用,可以在其中存储任何具有正确签名的可调用对象(函数指针、方法指针、具有< code >运算符()的对象),并且可以使用std::bind构造< code>std::function。

函数指针只能接受签名正确的函数,但可能稍快一些,并且可能生成稍小的代码。

 类似资料:
  • 一个函数总是占用一段连续的内存区域,函数名在表达式中有时也会被转换为该函数所在内存区域的首地址,这和数组名非常类似。我们可以把函数的这个首地址(或称入口地址)赋予一个 指针变量,使指针变量指向函数所在的内存区域,然后通过指针变量就可以找到并调用该函数。这种指针就是 函数指针。 函数指针的定义形式为: returnType (*pointerName)(param list); returnType

  • 我正在尝试编写一个类模板,在内部它使用一个函数(BFGS优化的实现,由环境提供),接口如下: 其中< code>fn和< code>gr是类型的函数指针 和 分别是。我的< code>C 类模板如下所示: 这样,它可以由任何具有两个指定成员函数的类进行实例化,例如: 这可能吗?或者也许有更好的方法来做到这一点 - 将两个成员函数分别作为函数指针传递?(如果目标函数和相应的梯度很简单,那么编写两个函

  • 函数指针基础语法 函数指针用于指向一个函数,函数名是函数体的入口地址。函数指针可以实现面向对象编程,可以实现软件分层设计(回调函数)。 #define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> //数组指针 语法 梳理 //定义一个数组类型 //int a[10]

  • 本文向大家介绍c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind,包括了c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind的使用技巧和注意事项,需要的朋友参考一下 一、符号修饰与函数签名 1、符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名。G

  • 函数指针包含函数在内存中的地址。第4章介绍了数组名实际上是数组中第一个元素的内存地址。同样,函数名实际上是执行函数任务的代码在内存中的开始地址。函数指针可以传人函数、从函数返回、存放在数组中和赋给其他的函数指针。 要演示如何使用函数指针,我们修改图 5.15 的冒泡排序程序,变成图 5.26 的程序。新程序包括 main 和函数 bubble、swap、ascending 和 descending

  • 往往,我们一提到指针函数和函数指针的时候,就有很多人弄不懂。下面详细为大家介绍C语言中指针函数和函数指针。 指针函数 当一个函数声明其返回值为一个指针时,实际上就是返回一个地址给调用函数,以用于需要指针或地址的表达式中。 格式: 类型说明符 * 函数名(参数) 由于返回的是一个地址,所以类型说明符一般都是int。 在c语言中,函数也是一种类型,可以定义指向函数的指针。我们知道,指针变量的内存单元