Благодаря С++ 11 мы получили семейство оболочек std::function
. К сожалению, я продолжаю слышать только плохие вещи об этих новых дополнениях. Самым популярным является то, что они ужасно медленны. Я тестировал его, и они действительно сосут по сравнению с шаблонами.
#include <iostream>
#include <functional>
#include <string>
#include <chrono>
template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }
float calc2(std::function<float(float)> f) { return -1.0f * f(3.3f) + 666.0f; }
int main() {
using namespace std::chrono;
const auto tp1 = system_clock::now();
for (int i = 0; i < 1e8; ++i) {
calc1([](float arg){ return arg * 0.5f; });
}
const auto tp2 = high_resolution_clock::now();
const auto d = duration_cast<milliseconds>(tp2 - tp1);
std::cout << d.count() << std::endl;
return 0;
}
111 мс против 1241 мс. Я предполагаю, что это потому, что шаблоны могут быть красиво встроены, а function
охватывают внутренности посредством виртуальных вызовов.
Очевидно, что у шаблонов есть свои проблемы, когда я их вижу:
- они должны быть предоставлены в виде заголовков, которые вы не захотите делать, когда вы отправляете свою библиотеку в виде закрытого кода,
- они могут сделать время компиляции намного дольше, если не будет введена политика
extern template
-like, - нет (по крайней мере, мне известно) чистого способа представления требований (концепций, кто угодно?) шаблона, выведите комментарий, описывающий, какой функтор ожидается.
Можно ли, таким образом, предположить, что function
может использоваться как фактический стандарт передающих функторов, а в тех местах, где ожидается высокая производительность, следует использовать шаблоны?
Edit:
Мой компилятор - это Visual Studio 2012 без CTP.