首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么C++ Lambda函数作为比较函数要比等效对象快得多

C++ Lambda函数作为比较函数要比等效对象快得多的原因有以下几点:

  1. 内联优化:Lambda函数可以在编译时进行内联优化,将函数体直接嵌入到调用处,避免了函数调用的开销。而等效对象需要通过函数指针或函数对象进行调用,会引入额外的函数调用开销。
  2. 减少函数对象的创建和销毁:Lambda函数可以在需要时直接定义,不需要显式地创建函数对象。而等效对象需要显式地创建一个函数对象,并在使用完毕后销毁,这个过程会引入额外的开销。
  3. 代码可读性和维护性:Lambda函数可以直接在使用它的地方定义,使得代码更加紧凑和易读。而等效对象需要在其他地方定义,并在使用时传递给相应的函数,使得代码结构分散,可读性和维护性较差。
  4. 灵活性:Lambda函数可以捕获外部变量,使得比较函数可以访问外部作用域的变量,增加了函数的灵活性。而等效对象通常只能通过构造函数或成员函数传递参数,限制了函数的灵活性。

综上所述,C++ Lambda函数作为比较函数要比等效对象快得多,主要是因为内联优化、减少函数对象的创建和销毁、代码可读性和维护性好以及灵活性高等原因。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++lambda函数还是对象

关于C++lambda函数还是对象,这其实不是一个一概而论的问题。 先说结论: 对于有捕获的lambda,其等价于对象。 对于没有任何捕获的lambda,其等价于函数!...首先,很多C++程序员从lambda 用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。...在没有捕获任何东西的时候,lambda其实是等价于普通的函数的!可以用Linux C中函数pthread_create()来验证!它只能接收一个参数是void*,返回值也是void*的回调函数。...神奇的是,无参的lambda也可以被pthread_create()使用!...+在lambda的设计上也贯彻着零开销 (Zero Overhead)原则,也就是C++不在性能上干多余的事,显然函数对象开销更小。

66210

C++】拷贝构造函数调用时机 ② ( 对象作为函数参数 | 对象作为函数返回值 )

另外一个 类实例对象 ; // 将一个对象赋值给另外一个对象 // 自动调用拷贝构造函数 Student s2 = s1; ③ 对象作为函数参数 : 类的实例对象 以值的方式 传递给函数 , 不是以...指针 或 引用 的方式 ; // 定义函数, 接收 Student 对象作为参数 void fun(Student s) { } ④ 对象作为函数返回值 : 函数直接返回类的实例对象 值 , 不是返回...---- C++ 语言中的 拷贝构造函数C++ 类中的 特殊构造函数 , 其作用是 创建一个新的 类实例对象 , 作为现有实例对象的 拷贝后的副本 ; 拷贝构造函数 的 主要作用 是初始化新创建的对象...实例对象作为参数 , 与 对象值 相对的是 对象指针 对象引用 定义函数 void fun(Student s) , 该函数 的 形参是 Student 类型对象 , // 定义函数, 接收 Student...; 该操作 全程 由 C++ 编译器完成 , 不需要 开发者 手动干预 ; 2、代码示例 - 对象作为函数参数 代码示例 : #include "iostream" using namespace

22220
  • C++对象模型_Class Obj作为函数参数

    开发环境 VC6.0 编辑器 Cmd Markdown 关于C/C++中基本类型(如:int,int*等)作为函数参数时,是通过将该变量的值压栈来进行参数传递;本文通过C++反汇编代码分析了当对象作为函数参数时...对象作为函数参数时,参数传递过程(如:函数的声明为:void show(class Object obj);该函数的调用的为show(arg);其中实参arg的类型为class Object):1,在栈顶上为...obj对象分配内存空间,然后将对象arg的首地址压栈;2,调用拷贝构造函数(此为C++中三种调用拷贝构造函数情况之一),将arg的数据成员拷贝至obj;3,执行show()函数体(此时,ebp+8即为obj...//C++源码。...{ i=rhs.i; printf("拷贝构造函数=%d\n",i); } void show(CBase B1, CBase B2) //对象作为形参。

    1.2K20

    C++】STL 算法 ② ( foreach 循环中传入 函数对象 Lambda 表达式处理元素 | foreach 循环算法 | Lambda 表达式 - 匿名 函数对象 仿函数 )

    文章目录 一、foreach 循环中传入 函数对象 / Lambda 表达式处理元素 1、foreach 循环算法 2、foreach 循环中传入 函数对象 处理元素 3、foreach 循环中传入 Lambda...表达式 处理元素 4、Lambda 表达式 - 匿名 函数对象 / 仿函数 一、foreach 循环中传入 函数对象 / Lambda 表达式处理元素 1、foreach 循环算法 在 C++ 语言中..., 如 : 函数 / 函数指针 / 仿函数 / 函数对象 / Lambda 表达式 , 并对范围内的每个元素调用该可调用对象 ; 注意 : 上述 迭代器 范围 是一个 前闭后开 区间 ; 2、foreach...表达式 - 匿名 函数对象 / 仿函数 在上面的代码中 , 使用了 Lambda 表达式 , 如下所示 : // 向 foreach 循环中传入 Lambda 表达式 // 在函数对象中打印元素内容...函数对象 / 仿函数 ; Lambda 表达式 语法如下 : [capture](parameters) -> return_type { body_of_lambda } capture 捕获列表 :

    26910

    C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法的 函数对象 参数是值传递 )

    文章目录 一、函数对象中存储状态 1、函数对象中存储状态简介 2、示例分析 二、函数对象作为参数传递时值传递问题 1、for_each 算法的 函数对象 参数是值传递 2、代码示例 - for_each...函数函数对象 参数在外部不保留状态 3、代码示例 - for_each 函数函数对象 返回值 一、函数对象中存储状态 1、函数对象中存储状态简介 在 C++ 语言中 , 函数对象 / 仿函数...二、函数对象作为参数传递时值传递问题 1、for_each 算法的 函数对象 参数是值传递 下面开始分析 for_each 函数函数对象 作为参数的 具体细节 ; for_each 算法的调用代码如下..., 这个函数对象 保留了 内部 函数对象参数副本 的状态值 ; 2、代码示例 - for_each 函数函数对象 参数在外部不保留状态 如果 在 for_each 算法中 调用了 函数对象 , 函数对象中...函数函数对象 返回值 如果 在 for_each 算法中 调用了 函数对象 , 函数对象中 有 状态改变 ; 在 for_each 算法 外部 继续调用该 函数对象 , 由于 for_each 是

    16510

    C++】STL 算法 ⑧ ( 预定义函数对象 | 预定义函数对象组成 | 预定义函数对象分类 | 预定义 算术运算符 函数对象 | 预定义 比较运算符 函数对象 | 预定义 逻辑运算符 函数对象 )

    文章目录 一、预定义函数对象 1、预定义函数对象概念 2、预定义函数对象组成 二、预定义函数对象分类 1、预定义 算术运算符 函数对象 2、预定义 比较运算符 函数对象 3、预定义 逻辑运算符 函数对象...三、代码示例 - plus 函数对象使用 1、plus 函数对象 2、代码示例 3、执行结果 一、预定义函数对象 1、预定义函数对象概念 C++ 的 标准模板库 ( STL , Standard Template...Library ) 中 , 预定义了一系列的 " 函数对象 “ , 又称为 ” 仿函数 Functors " ; 这些 " 预定义函数对象 " 在 STL 算法中 , 可以 作为 算法的参数 , 定制某些参数的行为...; 二、预定义函数对象分类 预定义函数对象 分为 如下几类 : 预定义 算术运算符 函数对象 预定义 比较运算符 函数对象 预定义 逻辑运算符 函数对象 1、预定义 算术运算符 函数对象 预定义 算术运算符...; 上述 " 预定义 算术运算符 函数对象 " 都是 二元函数对象 , 通常用于 transform 变换算法 , accumulate 累加和算法 , 等算法中 ; 2、预定义 比较运算符 函数对象

    11010

    C++】STL 算法 - transform 变换算法 ② ( 变换规则为 普通函数 | 变换规则为 Lambda 表达式 | 变换规则为 函数对象 | 变换规则为 函数适配器转换的函数对象 )

    vector 数组容器 vector myVector; 然后 , 定义了一个 接受一个参数的 Lambda 表达式 , 使用该 Lambda 表达式 作为变换规则 ; // Lambda...创建一个 vector 数组容器 vector myVector; 然后 , 定义了一个 一元函数对象 , 使用该 一元函数对象 作为变换规则 ; // 一元函数对象 class AddOne...创建一个 vector 数组容器 vector myVector; 然后 , 使用STL 中预定义的 一元函数对象 negate 作为变换规则 ; 该 预定义函数对象 源码如下 , 可以看到直接将输入参数...将预定义二元函数对象转成的 一元函数对象 在下面的代码中 , 首先 , 创建了一个 vector 数组容器 , 之后该容器 既作为输入容器 , 又作为输出容器 , 将元素输入后 , 计算后 , 在输出...将预定义二元函数对象转成的 一元函数对象 bind2nd(multiplies(), 10) multiplies 函数对象源码如下 : 该函数对象的 重载 函数调用操作符 函数 , 接收

    18610

    C++】构造函数初始化列表 ① ( 类对象作为成员变量时的构造函数问题 | 构造函数初始化列表语法规则 )

    一、类对象作为成员变量时的构造函数问题 1、问题描述 如果 一个类 A 的对象 作为 另外一个类 B 的成员变量时 , 在以下场景会报错 : 为类 A 定义 有参的 构造函数 , 那么 A 的无参默认构造函数就失效了...A 对象 , 但是 A 的 无参构造函数无法使用 , 必须使用 A 的有参构造函数 , 这里就出现问题 , 报错 “B::B(void)”: 由于 数据成员“B::m_a”不具备相应的 默认构造函数...或重载解决不明确,因此已隐式删除函数 ; class B { public: int m_age; // 年龄 A m_a; // A 类型成员变量 }; 解决上述问题的方案 就是 C++ 中的...========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ========== 二、构造函数初始化列表 ---- 1、构造函数初始化列表语法规则 在 C++ 语言中 , 构造函数初始化列表...B 对象 B b; // 控制台暂停 , 按任意键继续向后执行 system("pause"); return 0; } 执行结果 :

    61330

    【Python学习笔记之三】lambda表达式用法小结

    ,argument2,... argumentN:expression using argument 由lambda表达式所返回的函数对象与由def创建并复制后的函数对象工作起来是完全一样的,但是lambda...此外,作为一个表达式,lambda返回了一个值(一个新的函数),可以选择性的赋值给一个变量名。相反,def语句总是得在头部将一个新的函数赋值给一个变量名,而不是讲这个函数作为结果返回。...为什么使用lambda 通常来说,lambda起到了一种函数速写的作用,允许在使用的代码内嵌入一个函数的定义。...如果你知道在做什么,那么你就能在Python中作为基于表达式等效的写法编写足够多的语句。...一般来说,简洁优于复杂,明确优于晦涩,而且一个完整的语句要比神秘的表达式要好。 这就是为什么lambda仅限于表达式。

    81450

    Kotlin 作用域函数(scope function)

    本文依然是按代码比较,字节码分析,和扩展思考三个方面进行分析。 搞懂其中一个,其他作用域函数可以视为其变种。这篇文章我们先看 run 方法。...,即当 lambda 作为函数的最后一个参数时,可以写在函数括号外部,也就是说object.run { }和object.run({ })是等价的。...run的功能很简单,它就做了两件事: 把 lambda 内部的 this 改成了对应的调用对象。这个看起来很神奇,我们稍后再分析; run 函数会返回 lambda 的返回值。...inline,中文名内联函数,是 C/C++ 的老活儿了。inline 的意思是,虽然你声明了一个函数,但在编译期调用这个函数的地方会被替换为函数包含的代码。...它的效果也和扩展方法一样,在 扩展 lambda 作用域内,你可以以对象作为 this 来操作这个对象。 最后一个 contract 契约,指的是代码和 Kotlin 编译器的契约。

    1K10

    深入 C++ 回调

    你知道对象生命周期管理吗?为什么这里会崩溃,那里会泄漏? 在设计 C++ 回调时,你是否想过:同步还是异步?回调时(弱引用)上下文是否会失效?一次还是多次?如何销毁/传递(强引用)上下文?...在面向对象语言中,一等公民是对象,而不是函数;所以在实现上: 闭包 一般通过 对象 实现(例如 std::function) 上下文 一般作为闭包对象的 数据成员,和闭包属于 关联/组合/聚合 的关系.../unique_bind 只能移动,不能拷贝 不能构造 std::function unique_lambda 可以执行,上下文在 lambda 函数体内作为引用 unique_bind 不能执行,因为函数的接收参数要求拷贝...最后反而觉得基于 Coroutine 来写异步比较直观(不过这又需要保证闭包引用的对象不可移动,Pin 等一系列问题又出来了)。...可能这就是为什么 Go 比较流行的原因吧:Rust 的安全检查再强,C++ 的模板再炫,也需要使用者有较高的水平保证内存安全(无论是运行时还是编译期)。有了 GC,就可以抛弃底层细节,随手胡写了。

    9.3K106

    C++与汇编小结

    C++与汇编小结 ---- 本文通过C++反编译,帮助理解C++中的一些概念(指针引用、this指针、虚函数、析构函数lambda表达式), 希望能在深入理解C++其它一些高级特性(多重继承、RTTI...---- switch 在分支数少的情况下可以用if–else if模拟, 但是分支比较大的情况下,需要比较的次数太多, 如果是有序线性的数值,可将每个case语句块的地址预先保存在数组中,...+析构函数的调用过程,我们就知道了为什么C++基类的析构函数要声明为virtual了。...我们希望当调用C++基类BaseClass的析构函数时能够触发动态绑定,能够找到当前对象所属类的虚函数表中的析构函数。...lambda表达式具有如下形式: [capture list](parameter list) -> return type {function body} 下面定义了一个C++函数,其中有一个lambda

    1.2K40

    C qsort 与 C++ sort 函数

    第一个版本使用 operator< 来比较元素,第二个版本使用 comp 来比较元素。 不保证等效元素保持其原始相对顺序(请参阅 stable_sort )。...comp(可选)为接受范围内的两个元素作为参数,并返回可转换为 bool 的值的二元函数。返回 true 表示第一个参数排在第二个参数之前。...qsort 是 C 的库函数,sort 是 C++ STL 中的函数模板。 sort 更易于使用。 qsort 必须要指定比较函数,而 sort 可以指定,也可以缺省。 sort 速度更快。...sort 比 qsort 更快,因为 C++ 的模板为特定数据类型和特定比较函数生成优化的代码。sort 速度比手动编写的快速排序快 20% 到 50%,比 qsort 快 250% 到 1000%。...由于内联,C++ sort() 在同等数据上比 qsort() 快得多

    19310

    Modern c++快速浅析

    +中为什么不提倡使用vector?]...+ 为什么有时候必须额外写 template?...的泛用性在每代C++中都得到了提高 在C++11中,constexpr可以用来修饰对象(包括内置类型和自定义类型),以及可以用来修饰函数(构造函数,成员函数,普通函数等等),如果以constexpr修饰构造函数...Lambda表达式 Lambda表达式其实是块语法糖,其结构如下 [函数对象参数](函数参数列表) mutable throw(类型)->返回值类型 { 函数语句 }; •当捕获的是this时,lambda...(理解为能够延长生命周期的按引用捕获) 而C++中的按引用捕获并不能延长对象的生命周期,且按引用捕获会导致lambda表达式包含了对局部对象的引用,这很可能会导致空悬引用 std::function<void

    19410

    C++核心准则​T.141:如果你需要只在一个地方使用的简单的函数对象,使用无名的lambda表达式

    T.141: Use an unnamed lambda if you need a simple function object in one place only T.141:如果你需要只在一个地方使用的简单的函数对象...,使用无名的lambda表达式 Reason(原因) That makes the code concise and gives better locality than alternatives....为lambda表达式命名有助于改善明确性,即使是该表达式只使用一次。...检索完全一致和差不多一致的lambda表达式(以便替换为命名函数或命名lamabda表达式) 原文链接 https://github.com/isocpp/CppCoreGuidelines/blob...对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础

    66420

    C++11『lambda表达式 ‖ 线程库 ‖ 包装器』

    对于编程领域来说,可以使用 lambda 表达式 快速构建函数对象作为函数中的参数 1.1.仿函数的使用 仿函数C++ 中的概念,指借助 类+operator()重载 创建的函数对象,仿函数 的使用场景如下...表达式 构建出的 匿名函数对象 比较抽象,一般都是将此 匿名函数对象 作为参数传递(比如 sort),如果需要显式调用,最好是将创建出来的 匿名函数对象 赋给一个 有名函数对象,调用时逻辑会清晰很多...表达式 本质上就是一个 仿函数 1.4.lambda表达式的优点及适用场景 lambda 表达式 作为一种轻量级的匿名函数表示方式,具备以下优点: 简洁性: 对于简单的函数操作,无需再手动创建函数、调用...,只需要编写一个 lambda 表达式生成函数对象 方便些: lambda 表达式具有 捕捉列表,可以轻松捕获外部的变量,避免繁琐的参数传递与接收 函数编程支持: lambda 表达式可以作为函数的参数...带仿函数的等待,传入一个 unique_lock 对象,以及一个返回值为 bool 的函数对象,可以根据函数对象的返回值判断是否需要等待 为什么要在条件变量 wait 时传入一个 unique_lock

    38210

    【Python】Python中的运算符与注释

    由于输入函数的返回值为字符串,因此我们在通过input()获取输入的信息后就是需要通过一系列库函数来将获取到的字符串进一步转换成我们所需要的数据,如将字符串转换成整型的函数int(),以及分割字符串的函数...,我们如果想比较两个字符串之间的大小 ,只能通过库函数strcmp来完成字符串之间的比较。...,还是会存在一定的问题,因此小数之间的比较通常是通过作差之后比较精度,如下所示: 可以看到,此时获取的结果不是我们想象中的结果,为什么会这样呢?...a = 5 if a > 3: print(a) 这时有朋友可能会奇怪,为什么不直接使用括号先进行赋值操作,后通过关系操作符进行比较操作呢?...=, == 比较运算,包括成员检测和标识号检测 13 not x 逻辑非 NOT 14 and 逻辑与 AND 15 or 逻辑或 OR 16 if -- else 条件表达式 17 lambda lambda

    5810

    C++】STL 算法 ⑨ ( 预定义函数对象示例 - 将容器元素从大到小排序 | sort 排序算法 | greater<T> 预定义函数对象 )

    文章目录 一、预定义函数对象示例 - 将容器元素从大到小排序 1、sort 排序算法 2、greater 预定义函数对象 二、代码示例 - 预定义函数对象 1、代码示例 2、执行结果 一、预定义函数对象示例...- 将容器元素从大到小排序 1、sort 排序算法 C++ 标准模板库 ( STL , Standard Template Library ) 中 提供 了 sort 算法 函数 , 该函数定义在 <...值的 函数对象 ; 该 范围内的元素将 使用 该 二元谓词 规则进行排序 ; 2、greater 预定义函数对象 C++ 标准模板库 ( STL , Standard Template Library...) 中 提供 了 greater 预定义函数对象 , 这是一个 二元谓词 , 借助该函数对象可以很便的方式来比较两个值 , 确定第一个值是否大于第二个值 ; 该 函数对象 主要用于STL算法 中...控制排序顺序 , 搜索条件 等场景 ; greater 函数对象在 头文件中定义 , 它接受一个 泛型类型参数 T , 该参数指定了要比较的元素类型 ; greater

    17210

    C++】C++11常用特性总结

    那如果需要比较的性质特别多呢?...比如要比较商品的名字,价格,评价等等,并且要实现从小到大和从大到小的仿函数,那我们就需要实现6个仿函数,这样岂不是太繁琐了,写6个struct类,如果类的命名不太好,比如按照1-6来命名类,那看代码的人每看到一个仿函数都需要向上去找对应的仿函数看看具体是什么功能...C++此时觉得光有一个仿函数可调用对象有点不太够啊,能不能再搞出一个比仿函数用起来还舒服的对象呢?...sort内部进行排序的时候,会依次向后两两比较vector的元素,在比较时就会用我们传的可调用对象进行比较,然后给可调用对象传两个vector元素过去,根据比较结果开始进行排序,所以lambda表达式和仿函数对象一样都是可调用对象...function学起来并不困难,他其实就是将我们原来所学的可调用对象,例如函数指针,仿函数对象lambda进行包装,使其变成一个新的可调用对象,这个可调用对象就是包装器,有人说为什么要包装啊?

    80540
    领券