c++ - std::function 的性能开销是多少?

标签 c++ boost std

我在论坛上听说过 std::function<>导致性能下降。这是真的吗?如果属实,是不是性能大幅下降?

最佳答案

确实,在使用 std:function 时必须考虑到性能问题。 std::function 的主要优势,即它的类型删除机制,并不是免费的,我们可能(但不一定必须)为此付出代价。

std::function 是一个封装了可调用类型的模板类。但是,它没有在可调用类型本身上进行参数化,而仅在其返回和参数类型上进行参数化。可调用类型仅在构造时才知道,因此,std::function 不能拥有该类型的预声明成员来保存给其构造函数的对象的拷贝。

粗略地说(实际上,事情比这更复杂)std::function 只能保存一个指向传递给其构造函数的对象的指针,这会引发生命周期问题。如果指针指向的对象的生命周期小于 std::function 对象的生命周期,则内部指针将变为悬空。为了防止这个问题,std::function 可能会通过调用 operator new(或自定义分配器)在堆上复制对象。动态内存分配是人们最常说的std::function所暗示的性能损失。

我最近写了一篇更详细的文章,解释了如何(以及在​​哪里)可以避免支付内存分配的代价。

Efficient Use of Lambda Expressions and std::function

关于c++ - std::function 的性能开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057382/

相关文章:

c++ - 用指针直接访问STL列表的元素

c++ - 如果 boost::thread 创建线程失败,它会做什么?

c++ - Boost::使用 char 数组格式化

c++ - 如何遍历这样的 map ?如何修复 8 个可怕的 C2784 错误?

c++ - [[nodiscard]] 在 std::function 返回类型定义中?

c++ - 使用 cstdio 就地编辑文件?

c++ - 当基类被标记为虚拟时,正常 block 后的损坏

c++ - boost 图错误

c++ - boost cpu_timer入门,错误: ‘boost::timer::cpu_timer’ has not been declared

c++ - 使用带有预分配指针的shared_ptr