我在论坛上听说过 std::function<>
导致性能下降。这是真的吗?如果属实,是不是性能大幅下降?
最佳答案
确实,在使用 std:function
时必须考虑到性能问题。 std::function
的主要优势,即它的类型删除机制,并不是免费的,我们可能(但不一定必须)为此付出代价。
std::function
是一个封装了可调用类型的模板类。但是,它没有在可调用类型本身上进行参数化,而仅在其返回和参数类型上进行参数化。可调用类型仅在构造时才知道,因此,std::function
不能拥有该类型的预声明成员来保存给其构造函数的对象的拷贝。
粗略地说(实际上,事情比这更复杂)std::function
只能保存一个指向传递给其构造函数的对象的指针,这会引发生命周期问题。如果指针指向的对象的生命周期小于 std::function
对象的生命周期,则内部指针将变为悬空。为了防止这个问题,std::function
可能会通过调用 operator new
(或自定义分配器)在堆上复制对象。动态内存分配是人们最常说的std::function
所暗示的性能损失。
我最近写了一篇更详细的文章,解释了如何(以及在哪里)可以避免支付内存分配的代价。
关于c++ - std::function 的性能开销是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5057382/