第三章:函数对象

注意:此文介绍很多C++11新特性的知识(auto 关键字、Lambda 表达式、function 包装器),这不会在此读书笔记中记录,可以在我的其它地方找到相关的笔记,或者你可以自行去学习,毕竟,C++11 是现在 C++ 学习者必备的语法。

操作符包装器

操作符包装器.png

C++11 使用操作符包装器需要指明类型,如greater<int>()。但是 C++14 之后就可以不用了,如greater<>()。

std::function的性能问题和并发安全问题

虽然前面的内容都证明 std::function 很有用,但不能滥用,因为它有明显的性能问题。为了隐藏包含的类型并提供一个对所有可调用类型的通用接口,std::function 使用类型擦除的技术。本书并不打算深入研究这个问题,只需要知道它是基于虚成员函数调用就足够了。因为虚调用是在运行时进行的,编译器不能在线调用,所以也就失去了优化的机会。

std::function 另一个需要注意的是,虽然它的调用操作符限定为 const,但它可以调用非const对象。在多线程代码中,容易导致各种问题。


⭐️内容取自译者程继洪、孙玉梅、娄山佑《函数式编程》,仅从中取出个人以为需要纪录的内容。不追求内容的完整性,却也不会丢失所记内容的逻辑性。如果需要了解细致,建议读原书。