天天看點

C++中幾種callable實作方式的性能對比

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。這個順序符合我們的預期,但相差這麼多還是比較意外的。

繼續閱讀