mem_fn
меньше и быстрее, чем bind
. Попробуйте следующую программу с вашим любимым компилятором и сравните:
- Размер результирующего исполняемого файла и
- Количество секунд, сообщенных как потраченные.
Вы можете сравнить производительность bind
против mem_fn
, изменив 1 на 0 в строке #if
.
#include <iostream>
#include <functional>
#include <chrono>
struct Foo
{
void bar() {}
};
int main(int argc, const char * argv[])
{
#if 1
auto bound = std::bind( &Foo::bar, std::placeholders::_1 );
#else
auto bound = std::mem_fn( &Foo::bar );
#endif
Foo foo;
auto start = std::chrono::high_resolution_clock::now();
for( size_t i = 0; i < 100000000; ++i )
{
bound( foo );
}
auto end = std::chrono::high_resolution_clock::now();
auto delta = std::chrono::duration_cast< std::chrono::duration< double >>( end - start );
std::cout << "seconds = " << delta.count() << std::endl;
return 0;
}
Результаты могут отличаться, но в моей текущей системе * исполняемая версия mem_fn
на 220 байт меньше и работает примерно в два раза быстрее, чем версия bind
.
А в качестве бонуса mem_fn
не требует от вас добавления std::placeholders::_1
, как bind does
(под угрозой неясной ошибки компилятора).
Итак, предпочитайте mem_fn
, когда можете.