C++中想实现一个callable的对象,通常有四种方式:
<code>std::function</code>:最common的方式,一般会配合<code>std::bind</code>使用。
function pointer:最C的方式,但没办法实现有状态的callable object。
function object:就是重载了<code>operator()</code>的类,C++98的STL中经常用。
lambda expression:不会污染namespace,一般来说编译器内部会实现为一个匿名的function object。
从原理上性能最好的应该是3和4,其次是2,最差的是<code>std::function</code>。下面我们用一小段代码来测试它们的性能。
测试机器:15' rMBP。
编译器:Apple LLVM version 8.1.0 (clang-802.0.42)。
编译方式:g++ test.cpp -std=c++14 -O2。
可以看到3和4只要42ms,而相对应的2需要209ms,1需要358ms。这个顺序符合我们的预期,但相差这么多还是比较意外的。