什么是std :: function的性能开销?

我听到在论坛上使用std::function<>会导致性能下降。 这是真的吗? 如果属实,这是一个很大的性能下降?

您可以从boost的参考资料中find信息: 通过boost :: function调用会产生多less开销? 和性能

这并不决定“是或否”来提升function。 根据程序的要求,性能下降可能是可以接受的。 通常情况下,程序的某些部分不是性能关键的。 即使这样也可以接受。 这只是你可以确定的事情。

对于标准库版本,标准只定义了一个接口。 个人实现完全取决于它的工作。 我想用类似的实现来提升的function。

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

std::function是一个包装可调用types的模板类。 但是,它不是可调用types本身的参数化,而仅仅是它的返回和参数types。 可调用types只在构造时才被知道,因此, std::function不能有一个预先声明的这种types的成员来存放给它的构造函数的对象的副本。

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

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

http://drdobbs.com/cpp/232500059

如果你没有绑定任何参数(不分配堆空间)而不通过函数,这个强烈依赖。

还取决于其他因素,但这是主要的。

确实,你需要一些东西来比较,你不能只是简单地说,它“减less开销”,而不是根本不使用它,你需要比较它来使用另一种方式来传递一个函数。 如果你可以放弃使用它,那么从一开始就不需要

首先,函数的内部开销越来越小, 工作量越高,开销越小。

其次:与虚函数相比,g ++ 4.5没有任何区别:

main.cc

 #include <functional> #include <iostream> // Interface for virtual function test. struct Virtual { virtual ~Virtual() {} virtual int operator() () const = 0; }; // Factory functions to steal g++ the insight and prevent some optimizations. Virtual *create_virt(); std::function<int ()> create_fun(); std::function<int ()> create_fun_with_state(); // The test. Generates actual output to prevent some optimizations. template <typename T> int test (T const& fun) { int ret = 0; for (int i=0; i<1024*1024*1024; ++i) { ret += fun(); } return ret; } // Executing the tests and outputting their values to prevent some optimizations. int main () { { const clock_t start = clock(); std::cout << test(*create_virt()) << '\n'; const double secs = (clock()-start) / double(CLOCKS_PER_SEC); std::cout << "virtual: " << secs << " secs.\n"; } { const clock_t start = clock(); std::cout << test(create_fun()) << '\n'; const double secs = (clock()-start) / double(CLOCKS_PER_SEC); std::cout << "std::function: " << secs << " secs.\n"; } { const clock_t start = clock(); std::cout << test(create_fun_with_state()) << '\n'; const double secs = (clock()-start) / double(CLOCKS_PER_SEC); std::cout << "std::function with bindings: " << secs << " secs.\n"; } } 

impl.cc

 #include <functional> struct Virtual { virtual ~Virtual() {} virtual int operator() () const = 0; }; struct Impl : Virtual { virtual ~Impl() {} virtual int operator() () const { return 1; } }; Virtual *create_virt() { return new Impl; } std::function<int ()> create_fun() { return []() { return 1; }; } std::function<int ()> create_fun_with_state() { int x,y,z; return [=]() { return 1; }; } 

g++ --std=c++0x -O3 impl.cc main.cc && ./a.out输出g++ --std=c++0x -O3 impl.cc main.cc && ./a.out

 1073741824 virtual: 2.9 secs. 1073741824 std::function: 2.9 secs. 1073741824 std::function with bindings: 2.9 secs. 

所以,不要害怕。 如果您的devise/可维护性可以比通过虚拟调用更喜欢std::function来改善,请尝试使用它们。 就我个人而言,我非常喜欢不强制接口和inheritance我的类的客户端的想法。