std :: function vs template
Dzięki C ++ 11 otrzymaliśmystd::function
rodzina owijek functor. Niestety, wciąż słyszę tylko złe rzeczy na temat tych nowych dodatków. Najbardziej popularne jest to, że są strasznie powolne. Przetestowałem to i naprawdę są do bani w porównaniu z szablonami.
#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 ms vs 1241 ms. Zakładam, że to dlatego, że szablony mogą być ładnie podkreślonefunction
s pokrycie wewnętrznych poprzez wirtualne połączenia.
Oczywiście szablony mają swoje problemy, tak jak je widzę:
muszą być dostarczone jako nagłówki, co nie jest czymś, czego nie chcesz robić, gdy uwalniasz swoją bibliotekę jako kod zamknięty,mogą wydłużyć czas kompilacji, chyba żeextern template
podobnie jak polityka,nie ma (przynajmniej mi wiadomo) czystego sposobu reprezentowania wymagań (pojęć, kogokolwiek?) szablonu, baru komentarz opisujący jakiego rodzaju funktora jest oczekiwany.Czy mogę to założyć?function
s mogą być używane jakode facto standard przechodzących funktorów, aw miejscach, gdzie oczekuje się wysokiej wydajności, należy stosować szablony?
Edytować:
Moim kompilatorem jest Visual Studio 2012bez CTP.