::std işlevi vs şablonu
Teşekkürler C 11 functor kağıdı std::function
ailenin aldık. Ne yazık ki, bu yeni eklemeler hakkında sadece kötü şeyler duyuyorum. Korkunç derecede yavaş olduğunu popüler. Test ettim ve gerçekten şablonları ile karşılaştırıldığında, berbat.
#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 ms 1241. function
s sanal çağrıları aracılığıyla iç kapak ise bu şablonları güzel inlined olmasıdır sanırım.
Belli şablonlar onları gördüğünüz gibi kendi sorunları var:
- kapalı kod olarak kütüphane serbest zaman yapmak isteyebilirsiniz bir şey değil, başlıklar olarak sağlanacak
- 4 *-*politika tanıttı takdirde derleme zamanı çok fazla olabilir
- (en azından benim bildiğim) temsil gereksinimleri (kavramlar, kimse?) temiz yok bir şablon, bir açıklama bekleniyor açıklayan bar.
Böylece function
s olarak kullanılabilir olduğunu düşünüyorumde factogeçen standart funktorlar ve yüksek performans beklenen yerlerde şablonlar kullanılmalıdır?
Düzenleme:
Benim derleyici Visual Studio 2012olmadanCTP.
CEVAP
Eğer karşı karşıya iseniz genel olaraktasarımsize bir seçenek sunar Bu durumşablonlar kullanın. Ben kelime vurguladıtasarımüzerinde durulması gereken şey oldukça farklı olan std::function
ve şablonları kullanma durumları arasında fark olduğunu düşünüyorum çünkü.
Genel olarak, şablonları seçimi daha geniş bir ilkenin sadece bir örnekbirçok kısıtlamaları derleme zamanı sırasında mümkün olduğunca belirlemek için deneyin. Mantık basit: eğer programınız oluşturulur önce bile bir hata, ya da bir tür uyumsuzluğu yakalamak, müşteriye hatalı bir program gemi olmayacak.
Ayrıca, size doğru işaret etti, aramaları için şablon işlevleri çözülmüş statik olarak (yani derleme zamanında), bu yüzden derleyici tüm gerekli bilgiler için optimize ve muhtemelen satır içi kod (olmaz mümkünse çağrısı yapıldı aracılığıyla yapılan bir işlem).
Evet, şablon desteği, mükemmel olduğu doğrudur, ve C 11 hala kavramlar için bir destek vermediğini; ancak, std::function
bu konuda seni kurtaracağını nasıl görmüyorum. std::function
şablonlar kullanılamaz nerede şablonları, daha çok tasarım durumlar için bir araç için bir alternatif değil.
Böyle bir kullanım örneği arama gidermek için gerektiğinde ortaya çıkar-çalışma zamanıçağrı nesne çağırarak belirli bir imza yapışır, ama kimin beton türü derleme zamanında bilinmiyor. Bu genellikle potansiyel olarak geri bir koleksiyona sahip durumdafarklı türleriyapmanız gereken bu amadüzgün çağırmak; kayıtlı aramalar türü ve numarası programı ve uygulama mantığı durumuna bağlı olarak çalışma zamanında belirlenir. Bu geri bazı funktorlar olabilir, bazı fonksiyonları normal olabilir, bazı değişkenler için diğer fonksiyonları bağlama sonucu olabilir.
std::function
std::bind
da etkinleştirilmesi için doğal bir deyim sunuyoruzişlevsel programlamaC , nereye fonksiyonlar nesneler olarak kabul edilir ve doğal olarak ve diğer işlevler oluşturmak için körili kombine almak. Kombinasyon bu tür şablonları ile elde edilebilir olsa da, benzer bir tasarım durum genellikle birlikte zamanında birlikte çağrı nesne türünü belirlemek için gerektiren durumlarda kullanımı ile birlikte geliyor.
Son olarak, std::function
inanıyorum kavramsal farklılıklar dışında olursa recursive lambdas; ancak, bu kısıtlamalar daha dikte yazmak istiyorsanız, örneğin teknolojik kısıtlamaları tarafından kaçınılmaz olduğu başka durumlar da vardır.
Özetletasarım odaklanmakve bu iki yapıları kavramsal kullanım durumları neler olduğunu anlamaya çalışın. Eğer karşılaştırma içine senin yaptığın şekilde koyarsanız, onlar büyük olasılıkla ait olmayan bir arenaya onları zorlama.
C sınıfı şablonu içinde şablon işlevi...
::std işlevi vs şablonu...
Nasıl variadic şablon işlevi içine bir...
'veritabanından İlk' Şablonu...
Bir nesnenin mevcut tüm özelliklerini ...