SORU
5 Aralık 2012, ÇARŞAMBA


Neden Lambda daha düz fonksiyonları daha derleyici tarafından optimize edilebilir?

Kitabında The C Standard Library (Second Edition) Nicolai Josuttis Lambda daha düz fonksiyonları daha derleyici tarafından optimize edilebilir olduğunu belirtir.

Buna ek olarak, C onlardan daha iyi optimize Lambda Derleyiciler olağan işlevleri. (Sayfa 213)

Bu yüzden mi?

Bir fark daha fazla olmamalı satır içi uygulaması gelince düşündüm. Aklıma gelen tek sebep Derleyiciler Lambda ile daha yerel bir bağlam olabilir ve böyle fazla varsayım ve daha fazla iyileştirmeler gerçekleştirebilirsiniz.

CEVAP
5 Aralık 2012, ÇARŞAMBA


Sebebi Lambda olmasıdırişlevi nesneleriçok işlevi bir şablon geçirmeden yeni bir işlev nesnesi için özel olarak başlatılamadı. Derleyici basit satır içi lambda arayabilirsiniz böylece.

Fonksiyonlar için, diğer taraftan, eski uyarı geçerlidir: bir fonksiyonişaretçiişlev şablonu geçti ve Derleyiciler geleneksel olarak sorunları işlev işaretçileri üzerinden aramalar satır içi uygulaması var. Onlarolabilirteorik olarak inlined, ama eğer çevredeki işlevi de inlined.

Örnek olarak, aşağıdaki işlev şablonu göz önünde bulundurun:

template <typename Iter, typename F>
void map(Iter begin, Iter end, F f) {
    for (; begin != end;   begin)
        *begin = f(*begin);
}

Lambda ile arama: bunun gibi

int a[] = { 1, 2, 3, 4 };
map(begin(a), end(a), [](int n) { return n * 2; });

Bu örnekleme sonuçları (derleyici tarafından oluşturulan):

template <>
void map<int*, _some_lambda_type>(int* begin, int* end, _some_lambda_type f) {
    for (; begin != end;   begin)
        *begin = f.operator()(*begin);
}

... derleyici _some_lambda_type::operator () bilir ve bu çağrı içi basit olabilir. (Ve işlevi ile map çağırmaherhangi birdiğer her lambda lambda farklı türü vardır beri map yeni bir örnekleme oluşturur.)

Ama bir işlev işaretçisi adında bir örnekleme aşağıdaki gibi görünüyor

template <>
void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) {
    for (; begin != end;   begin)
        *begin = f(*begin);
}

... ve burada f puan için farklı bir adres için her arama için map ve böylece derleyici olamaz satır içi aramalar için f sürece çevre aramak map var da inlined böylece derleyici karar f belirli bir fonksiyon.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Electro Posé

    Electro Pos

    21 ŞUBAT 2013
  • jkimisyellow...ish

    jkimisyellow

    8 Temmuz 2009
  • 趣味そうこ♪

    趣味そう

    3 Mart 2010