SORU
3 ŞUBAT 2013, Pazar


::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. functions 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 functions 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
3 ŞUBAT 2013, Pazar


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Joe DiFeo

    Joe DiFeo

    7 AĞUSTOS 2012
  • Tips On Linux

    Tips On Linu

    26 Temmuz 2008
  • vgeller1

    vgeller1

    22 Kasım 2009